c++int负数补码隐式类型转换
unsigned y = 1;
int x = -2;
cout << x + y << endl;
对于上述的结果为
这⾥⾯有⼀个负数的补码问题和不同类型之间的隐式类型转换问题
⾸先负数的表⽰⽅法是负数的绝对值的⼆进制码取反再加1,-2的补码计算就是:
0000 0000 0000 0010->1111 1111 1111 1101->1111 1111 1111 1111 1110
⽽整数的加减在内部都是通过加运算实现的,主要原因是使⽤补码,可以将符号位和其它位统⼀处理;同时,减法也可按加法来处理。另外,两个⽤补码表⽰的数相加时,如果最⾼位(符号位)有进位,则进位被舍弃。
1的⼆进制表⽰是:0000 0000 0000 0001
x + y在内部的⼆进制表⽰就是1111 1111 1111 1111
对于最后的类型⼜有⼀个隐式类型转换的规则,两个通⽤的指导原则如下:
1、为防⽌精度损失,如果必要的话,类型总是被提升为较宽的类型。
2、所有含有⼩于整形的有序类型的算术表达式在计算之前其类型都会被转换成整形。
⼀般来说各种类型的转换顺序为 long double > double > float >=  int >= short > char,unsigned > signed 。
由于unsigned > signed,所以x+y被解释为unsigned,最后输出值就是2的32次⽅减⼀
补码的最小负数int取值范围
-2^31 ~ 2^31-1
为什么负数是 -2^31 ⽽不是-2^31-1呢?
因为规定了1000 0000, 0000 0000, 0000 0000, 0000 0000这个特殊的数(本来是-0的)为-2^31,所以负数就多⼀个
同理char类型的取值范围为-128到127,在这⾥也是把1000 0000表⽰为-128