C语言 char被赋值后与原值不同

各位大神,本人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。
            请问这是为什么?有遇到过这种情况的吗?十分感谢!
c

5个回答

char类型占一个字节,所占位数为8位。其取之范围为-128~127(补码形式存储)。现在:
 #define STOP_FLAG 0x82   //0x82是以16进制形式表示,0x82转换为10进制后为130。已经超出了char类型的范围,因此你打印的第二个值是一个不确定或说不准确的值。问题的本质就在这里。

 修改:
 125的16进制表示为7D。因此 STOP_FLAG的值只要小于等于7D都是可以正常的。

望楼主采纳!!!谢谢。

weixin_43249053
weixin_43249053 瞎说,是确定值,符号位扩展了而已!
一年多之前 回复

溢出了。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

weixin_43249053
weixin_43249053 你把char 定义为无符号形式,就不会有位扩展就是0了,两个结果就会一样了。
一年多之前 回复

越界了。还望采纳。谢谢。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问