i=126与i=128结果的区别,该怎么处理

i=126与i=128结果的区别
C/C++ code
#include<stdio.h>


int main()
{
    char i;
    //i = 126;
    i = 128;

    printf("%d\n", i + 3);//结果怎样呢

    return 0;
}


****************************************************************
学计算机组成原理的时候,听得不是很清楚,麻烦大家解释下

------解决方案--------------------
喜欢你的编程风格
+3了不就是越界了么?
char i i的范围:-128~127
128就是-128
129就是-127
依次类推,最后把结果按照有符号十进制整数输出,就这么简单吧。 
你想的很复杂?
------解决方案--------------------
百度一下“补码”吧,有详细介绍
char是1个字节的,也就是八位二进制码
但是因为它是有符号型的
所以最高位要作为符号位
1表示负数,0表示正数
所以char的表示范围是-2^7~2^7-1(因为0占了一位)
所以10进制的范围就是-128~127
------解决方案--------------------
在PC上基本上普通char是有符号的,取值范围是-128~127。

i = 128;

128是一个整形常量,类型是int,参考《C程序设计语言 第二版》(K&R)附录A.6.2 整形转换:

将任何整数转换为带符号类型时,如果它可以在新类型中表示出来,则其值保持不变,否则它的值同具体实现有关。

VC和gcc都是直接截断,128用二进制补码表示是00000000000000000000000010000000,i的值为10000000,同样是二进制补码表示,最高位是符号位,因此i的值为-128。

i+3这里还有一个整形提升,根据上面的原则,i的值不变,依然为-128。

最后i+3的值为-125。


------解决方案--------------------
探讨

引用:

喜欢你的编程风格
+3了不就是越界了么?
char i i的范围:-128~127
128就是-128
129就是-127
依次类推,最后把结果按照有符号十进制整数输出,就这么简单吧。
你想的很复杂?

为什么会是-127呢,而126+3是129,而不是-127呢

------解决方案--------------------
好了,解决了!结贴吧!

我收个尾
------解决方案--------------------
运算+u(w)、-u(w)、*u(w)和+t(w)、-t(w)、*t(w)在位级上具有相同的结果,也就是说它们的二进制位是一样的。这里u代表unsigned, t表示补码(two's-complement),w表示位长。
------解决方案--------------------
这还要看char类型,编译器是怎么解释的。编译器对char类型的解释有可能有两种:singed和unsigned的。不同的解释,那么char的范围就会不同。结果自然不一样了。
------解决方案--------------------
探讨

在PC上基本上普通char是有符号的,取值范围是-128~127。

i = 128;

128是一个整形常量,类型是int,参考《C程序设计语言 第二版》(K&amp;R)附录A.6.2 整形转换:

将任何整数转换为带符号类型时,如果它可以在新类型中表示出来,则其值保持不变,否则它的值同具体实现有关。

VC和gcc都是直接截断,128用二进制补码表示是0……

------解决方案--------------------
char 类型范围为-128~127
如果对char进行算术运算,结果超过了这个范围就称为溢出
溢出以后还要保证结果要在范围之内,用以下公式来处理
 1,如果正溢出(运算结果大于127),则将结果减去2的w次方(w为位的个数,char占8位,所以w=8)
 2,如果负溢出(运算结果小于-128),则将结果加上2的w次方,即256

所以128这个溢出的结果经处理以后变为128-256 = -128
所以129这个溢出的结果经处理以后变为129-256 = -127