1和255有什么区别?

待到秋来九月八,我花开尽百花杀
-1和255的区别
了解了负数在计算机内存中的储存方式,也知道了计算机如何计算这些数,那么就生成了另外一个问题,-1和255有什么区别,同理还有许多负数与正整数发生了重叠的问题,就像是-1和255的在内存中的表示都是1111 1111,计算机是如何区分这些的呢?
参考:
比如
1111 1111 + 0000 0010
计算机算出
进位=1,值 = 0000 0001
编译器这时就要分辨,如果输出要求是有符号输出的,则输出1 。如果输出要求无符号输出就按255+2输出,但要知道char最高位为8比特,最多表示为255,再+2就溢出了,输出表示仍然是1 。
(要解释一下,char进入CPU时要进行整型提升,255和-1实际存入的是 1 1 1111 1111,所以如果直接无符号输出的话可能是,同样这也是整形的最大表示数,再+2,就会溢出,即便是强转int型也要输出的是1 。参考:)
我们可以实验一下:
#includeint main(){char a = -1;char b = 255;printf("%d\n", a);printf("%u\n", b);printf("%d\n", a + 2);printf("%u\n", b + 2);system("pause");return 0;}

1和255有什么区别?

文章插图
这也就验证了上述举例的正确性,那么前述的编译器识别输出的说法怎么证明呢?255和-1太特殊了,我们换一个一般的数就可以证明 。
比如 -3 和 253
#includeint main(){char a = -3;char b = 253;printf("%u\n", a);printf("%u\n", b);printf("%d\n", a + 2);printf("%u\n", b + 2);system("pause");return 0;}
【1和255有什么区别?】(注意:之所以输出了是整型提升的结果!)