源码反码与补码
要理解整形转换规则,先要明白整形在计算机中存储形式。
原码
先说最简单的无符号整数。
[0000 0001]原 = 1
[1000 0001]原 = 129
对有符号数来说最高位是符号位,0表示正数,1表示负数。
[0000 0001]原 = 1
[1000 0001]原 = -1
所以int8的最大值表示不了129,下面都以有符号数为例。
反码
正数的反码与原码相同,负数的反码与原码的关系是:符号位不变,其他各位按位取反。
无符号位都是正数,略过不讲,这里只说有符号位数。
[0000 0001]原 = [0000 0001]反 = 1
[1000 0001]原 = [1111 1110]反 = -1
人脑需要把反码转换为对应的原码,才能计算出它实际的值。
补码
正数的补码与原码和反码都相同,负数的补码等于其反码加1
[0000 0001]原 = [0000 0001]反 = [0000 0001]补 = 1
[1000 0001]原 = [1111 1110]反 = [1111 1111]补 = -1
补码同样对人脑不友好,需要转换到对应的原码,才能计算出实际值。
引入补码的原因
补码对人并不直观,引入补码的原因是为了简化计算。加法作为最基础的运算,设计的越简单越好。引入补码后,符号位可以直接参与运算,不用额外记忆,可以把减法转换为减法。
以-1-1为例,-1-1 = -1 + (-1)
[1000 0001]原 + [1000 0001]原 = [1111 1111]补 + [1111 1111]补 = [1 1111 1110]补 = [1 0000 0010]原 = -2
整形转换
由小字节整型向大字节整型转换很直观,说下大范围的整型向小范围整型转换的情况
-129 = [1 1000 0001]原 = [1 0111 1110]反 = [1 0111 1111]补
将-129转为int8,值能保留8位,舍去最高的符号位,剩下的是[0111 1111]为正数,补码与原码相同,值为127
原文地址:https://www.cnblogs.com/progyoung/p/11674543.html