各位大神,本人C语言小白一个。
现在有个需求,要给一个char复制,代码如下:
#define STOP_FLAG 0x82
char msg[3];
{
...
msg[0]=STOP_FLAG;
printf("0x%x 0x%x\n",STOP_FLAG,msg[0]);
…
}
上面的输出结果一个是0x82,一个是0xffffff82。
请问这是为什么?有遇到过这种情况的吗?十分感谢!
char类型占一个字节,所占位数为8位。其取之范围为-128~127(补码形式存储)。现在:
#define STOP_FLAG 0x82 //0x82是以16进制形式表示,0x82转换为10进制后为130。已经超出了char类型的范围,因此你打印的第二个值是一个不确定或说不准确的值。问题的本质就在这里。
修改:
125的16进制表示为7D。因此 STOP_FLAG的值只要小于等于7D都是可以正常的。
望楼主采纳!!!谢谢。
溢出了。msg[0]是char类型,范围是-128-127.0x82 == 130
msg的定义改成unsigned char 类型就好了。至于为什么好好翻翻课本吧。
首先char是带符号,单字节。
0x82=1000 0010(2进制)符号位(最高位)是1
以%x输出是4个字节,有符号位扩展。变成1111 1111 1111 1111 1111 1111 1000 0010 =0xffffff82
你以%d输出就是-126
越界了。还望采纳。谢谢。