c小问题

c语言小问题

直接来看代码,然后推断下面代码输出为什么?

1
2
3
4
5
char a = 127;
printf("a=%d\n", a + 1);
char b = 127;
b++;
printf("b=%d\n", b);

这个题目一看就觉得很难简单是吧,不就是两个数+1嘛!

不出意外的话,你首先想到的应该是这个:

1
2
a = 128
b = 128

好了,不卖关子了,真实结果是这样的:

1
2
a=128
b=-128

是不是觉得不可思议,为什么同一个类型的值同时进行了一个“+1”操作,结果却是不一样的呢?

接下来说说原因:

计算机中运算是进行二进制的运算的,因此不管a还是b,在运算时初始值都是一个字节,二进制为0111 1111,进行+1操作后就是1000 0000,上面只是计算公式结果,解读为128,而下面char型变量,是有符号数,范围是-128~127,所以这个数就是-128。

也可以这么理解,第一个编译器可能认为是unsiged char,第二个可以强制认为b就是char。