原码、反码、补码
探讨Int范围
无符号
根据乘法原理 共有2^32=4,294,967,296种可能 也就是0~4294967295 共4,294,967,296,因为二进制权重为2^31~2^0,所以有2^32-1计算最大的情况
int 4byte 32位
有符号
int 4byte 32位 1位符号位 剩下31位 二进制每个有个2种情况0和1,
则按照乘法原理 仍然共有共有2^32=4,294,967,296种可能,
只不过是0~2,147,483,647(int_max)和-2,147,483,648(int_min)~1,也就是2,147,483,648x2=4,294,967,296
int最大为 0111 1111 1111 1111 1111 1111 1111 1111
转换为10进制为:2^31-1=2,147,483,647
int最小为
原码 在2^31(2,147,483,648)前添上负号位
反码 1 0111 ... 1111
+1 1 1000 ... 0000
发现-2,147,483,648的原码和补码一样
上边是逻辑上来说,不重要,下边解释
如果按照-1 取反的步骤来说 int_min 1000 0000 0000 0000 0000 0000 0000 0000无法再-1因为符号位不可再减,所以没法算,所以直接规定为-2,147,483,648
对比参照char 的1000000 (-128)也无法-1 ,没法算直接规定为-128
发现2,147,483,647的补码+1就变成-2,147,483,648
方便讨论,把例子换成char 范围是[127,-128]
127的补码+1 ,补码就变成-128
char的范围 无符号 有符号
对于这个例子char有符号 a ,b都能存下,在参与=运算发生整型提升,再截断只剩8字节
c无法存下130,所以会出现负数,可以看作127在环中+3,所以结果为-126
printf也是一个特殊的需要整型提升的运算
如果忘了,详见操作符详解(2)