c语言基础问题

#include"stdio.h"
int main()
{
unsigned char a=255;
a=a+1;
printf("%d",a);
return 0;
}
此时输出为0
#include"stdio.h"
int main()
{
unsigned char a=255;
printf("%d",a+1);
return 0;
}
后面这段代码与第一段不是一样吗?输出为什么是256?不应该是0吗?

因为 变量 a 的类型是 unsigned char 型, 它在内存里的 长度 只有 一个字节,也就是 8 个 二进制位,比如十进制整数 0 (也就是ASCII码值为0的字符)在内存里的二进制表示是 「0000 0000」(中间的空格只是为了方便看清,实际并没有空格。)
那么,第一段程序的 语句 a = a + 1,是把值 256 赋值给了 变量 a 的,256 的二进制写出来是 1 0000 0000(前面一个数字 1 ,后面 8 个数字 0 ,总共 9 个有效数字。实际内存中在 1 前面肯定还有至少 7 个0 ,和这里的程序运行分析没关系,就不谈了。)那么 变量 a 只有 8 个二进制来存储数据,所以就只存储下了后面的 8 个 0, 前面的全部舍弃了。 所以 输出 就是 0。
而第二段程序的 语句 并没有 把 a + 1 赋值给 什么变量, 所以就直接输出了 256 。
(如有帮助,烦请采纳,谢谢!)
温馨提示:答案为网友推荐,仅供参考
第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;
}本回答被提问者和网友采纳
相似回答