有符号类型引发的奇怪现象

用户头像
jiangling500
关注
发布于: 2020 年 10 月 16 日

最近在工作中需要对接LED显示屏,对接过程其实很简单,只需要按照显示屏协议进行组包,然后发送给显示屏即可。但显示屏显示出来的内容并不符合预期,肯定是哪里组包出错了,于是决定将发送给显示屏的数据包按照十六进制打印出来,对照着协议看看哪里出错了。于是就有了下面的printHex()函数,另外为了模拟组包过程,我使用了一个int类型的整数表示要发送给显示屏的数据。

void printHex(const char *buf, int len)
{
if ((NULL == buf) || (0 == len))
{
return;
}
for (int i = 0; i < len; ++i)
{
printf("%02x ", buf[i]);
}
printf("\n");
}
int main()
{
int num = 0x000000AA;
char buf[1024] = {0};
int len = 0;
memcpy(buf, &num, sizeof(num));
len += sizeof(num);
printHex(buf, len);
return 0;
}

输出如下:

ffffffaa 00 00 00

在上面输出中,printHex()函数将0xAA输出为了0xffffffaa,明显不符合预期,我们想要的结果是0xaa。通过仔细观察0xffffffaa,如果这是一个有符号整数的值,那么肯定是一个负数,我们再看一下buf[i]数据类型,确实为有符号char类型,而且buf[0]的值为0xAA,也就是说最高位为1,那么在打印的时候,就会被当成一个负数,所以输出结果就是上面看到的那样。实际上,我们应该将组包的内容全部当作无符号类型进行打印,只需要将char修改为unsigned char即可,修改后的代码如下:

void printHex(const unsigned char *buf, int len)
{
if ((NULL == buf) || (0 == len))
{
return;
}
for (int i = 0; i < len; ++i)
{
printf("%02x ", buf[i]);
}
printf("\n");
}
int main()
{
int num = 0x000000AA;
char buf[1024] = {0};
int len = 0;
memcpy(buf, &num, sizeof(num));
len += sizeof(num);
printHex((unsigned char*)buf, len);
return 0;
}

输出如下:

aa 00 00 00

这下输出正常了。

发布于: 2020 年 10 月 16 日 阅读数: 16
用户头像

jiangling500

关注

万丈高楼平地起,勿在浮沙筑高台! 2019.12.17 加入

一名IT从业者,熟悉Linux下C/C++,了解MySQL、Java等。

评论

发布
暂无评论
有符号类型引发的奇怪现象