为什么在C++中使用char数学会导致意外的结果



我有一个函数,我很难理解数学是如何执行的:

unsigned long Fat_AuthAnswer(char b1, char b2, char b3, char b4)`
{
unsigned char* ptr = NULL;
unsigned short StartCRC = b1 + b2*256;
unsigned long ret = crcbuf(StartCRC, b3, &AuthBlock[b4]);
ret = (ret & 0x0000ffff) | (crcbuf(StartCRC, b4, &AuthBlock[b3])<<16);
}

b1=0xAF b2=0x50

当函数被执行时,StartCRC=b1+b2*256;产生起始CRC=0x4FAF

我本以为StartCRC的结果是0x50AF。

我的问题是,为什么b2似乎减少了一?如有任何帮助,我们将不胜感激。感谢

您的环境中的char似乎已签名,并且值0xAF已符号扩展到值行0xFFFFFFAF。这将导致0xFF被添加到b2的一部分,因此看起来b2减少了一。

您应该将b1强制转换为unsigned char以避免这种情况。

unsigned short StartCRC = static_cast<unsigned char>(b1) + b2*256;

相关内容

  • 没有找到相关文章

最新更新