第1个回答 2019-01-07
a 是unsigned char 1个字节范围0~255
c语言不同类型计算赋值的陷阱要小心
1是int 占用字节 范围
msdos 2个字节 -32768~32767
win32 4个字节 -2147483648~2147483647
暂且假定int为2字节进行分析
a = a + 1
执行a + 1 这个+操作的时候类型不一致存在类型形转换
把unsigned char 的a 先转成 int 去和1 求和
0xff+0x0001
->0x00ff+0x0001
->0x0100
求完和的结果是 int的256
int的256
执行a=256 把int的256赋值给unsigned char的a 又进行了类型转换
255是0xff
256是0x0100
256 int转unsignedchar的时候就把高byte的0x01丢弃了,而把低byte的0x00给了a
所以就变为了0
而下面的 a + 1的结果 int的256直接给了printf 不存在第二次类型转换
第2个回答 2019-01-07
printf("%d",a+1); -- a+1 是表达式,1 是 int 型, a 是 较低级的 unsigned char 型,要化成 较高级的 int 型 计算,得 int 型 256,输出 int 型 256,输出显示 256。
a=a+1; 是语句,a+1 得 int 型 256, 然后 做赋值运算,这时 要转化为 unsigned char 型,相当于执行 a = (unsigned char) (a+1), 即取 2进制 低 8位值,得 0。输出显示0.
int main()
{
unsigned char a=255;
printf("%d\n",a+1); //输出 int 型 表达式 的值 256
a=a+1; // 计算得 unsigned char型 数值 0
printf("%d",a); //输出 0
return 0;
}本回答被提问者和网友采纳