为什么以下代码的输出结果是-128,而不是127?

#include <stdio.h>

int main()
{
char d;

for (d = 0; d + 1 > 0; d++)
{
;
}

printf("d is %d\n",d);

return 0;
}

输出结果:
d is -128

for (d = 0; d + 1 > 0; d++)
d从0开始自增,到了d=127,然后127+1>0满足条件,继续下一个循环
但是这个时候d是char型,能表示的范围为-128到127,所以127再自增后就变成了-128,
-128+1 < 0不满足条件则跳出,所以输出-128
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-09-03
d=127时 127+1>0
然后d++
由0111 1111变成1000 0000
d变成-128,这是后d+1<0;
所以输出-128。
注意d+1和d++不是一会事,d+1返回的不是char型。
第2个回答  2010-09-03
你这是数据溢出了,char类型的范围是0-127,你的程序执行的时候,d的值大致127时条件仍然成立会继续循环(此时的二进制值为:01111111),d再加1,但这个时候因为char大小的限制d的值不会为128,而会产生溢出(此时的二进制值为:10000000),符号位改为负,结果变成-128
第3个回答  2010-09-03
你写这个想干什么???
d++,这个后++是在执行动作后自加,况且你的这个循环,它不数据不错误循环不结束,而 char型的数据范围你是知道的,呵呵.
第4个回答  2010-09-03
当然是-128啦,127时d+1>0,成立。然后整数溢出,变为-128,使得d+1>0不成立
第5个回答  2010-09-03
for语句执行顺序是初始值-->语句-->递增值-->条件-->语句,先执行第三句,再去判断条件,如果成功就继续不成功就结束.所以到最后一次的时候,d增加了1,虽然条件已经不满足了,但值已经加完,所以输出为-128

为什么以下代码的输出结果是-128,而不是127?
-128+1 < 0不满足条件则跳出,所以输出-128

为什么8位二进制数表示的范围是-128到127(有符号型数据),我不懂为什 ...
-128是10000000,八位二进制数一共有256种码,1到127,政府数只差一个最高位,0是00000000(即正0),负0,即10000000被定义为-128.

1字节的表示范围为-128到127,为什么不是-128到128
-1-127的结果应该是-128,在用补码运算的结果中, [1000 0000]补 就是-128。但是注意因为实际上是使用以前的-0的补码来表示-128, 所以-128并没有原码和反码表示。(对-128的补码表示[1000 0000]补算出来的原码是[0000 0000]原, 这是不正确的)使用补码, 不仅仅修复了0的符号以及存在两个编码...

为什么-128无法被原码或反码表示?
在八位二进制下,因为有一位是符号位,原码和反码只能表示0到127,-0到-127,所以-128不能用原码或反码表示。按这种说法,128因为无法用八位二进制下的原码表示,则-128的八位二进制下的补码也是不存在的。但是,为了在数的表示上消除编码映射的不唯一性,所以通过人为的定义对转换的10000000强制认定...

java的一个程序如下,输出结果为什么为—127呢?为什么是负数呢?怎么算出...
byte范围 -128~127之间。当数字为127的时候,不溢出,相当于最大的127。128的时候,溢出,相当于最小的负数,也就是-128。所以,129就是-127

java中byte的范围为何是-128---127而不是-127---127? 1111 1111 这个应...
我们都知道byte占8位。而2的8次方等于256,也就是byte最多可以表示256个不同的数,0~127:128个 -0~127:128个 但是这里0与-0表示一样的数了,所以就用-0的二进制补码表示到-128里面去了

为什么8位的二进制补码范围是-128-127,而不是-127-127呀?为什么差一...
虽然“-0”也是“0”,但根据正、反、补码体系,“-0”的补码和“+0”是不同的,这样就出现两个补码代表一个数值的情况。为了将补码与数字一一对应,所以人为规定“0”一律用“+0”代表。同时为了充分利用资源,就将原来本应该表示“-0”的补码规定为代表-128。

为什么8位有符号类型的数值范围是-128~127
而对应的补码只有一种表示方式,-128在原码和反码中无法表示,在补码中却可以表示(用-127的补码 1000 0001 减1得到 1000 0000 )。而计算机中数值以补码形式存储和运算,当然-128可以表示出来,因此8位有符号数值的范围是-128~127,同理其他位数(16、32、64)也可以以此类推。

为什么8位的二进制补码范围是-128~127,而不是-127--127呀??为什么差一...
于是就引入了补码概念. 负数的补码就是对反码加一,而正数不变,正数的原码反码补码是一样的.在补码中用(-128)代替了(-0),所以补码的表示范围为:(-128~0~127)共256个.注意:(-128)没有相对应的原码和反码, (-128) = (10000000)参考资料:http:\/\/zhidao.baidu.com\/question\/4319911.html ...

8个二进制位补码表示带符号正数取值范围为什么是[-128,127]呢?
可见下表:-128 没有原码和反码!那么,怎么求其“补码”?千万不要用“取反加一”,就是个坑!必须用补码的定义式来求: [ X ]补 = 模 + 该负数X 即:[-128]补 = 256-128 = 128 = 1000 0000。

相似回答