一个整数的原码就是这个数对应的二进制形式,最高位是符号位,0代表正数,1代表负数
二进制算法:短除法,除2取余,其中余数要倒置
以10和-10举例【假设计算机字长为8位】:
10的原码:0000 1010
-10的原码:1000 1010
以10和-10举例【假设计算机字长为8位】:
10的反码:0000 1010
-10的反码:1111 0101
因为第一位是符号位,所以机器数的形式值就不等于真正的数值。
在2进制中,10001010表示138,但是因为最该位是符号位,所以其真正的数值为-10
正数的真值是原码,负数的真值是补码
计算机辨别"符号位"会让计算机的基础电路设计变得复杂,于是,人们想出了将符号位也参与运算的方法。代替原则:减去一个数等于加上这个数的相反数,即A - B = A +(-B)
使用原码:
10 -10 = 10+(-10)= (0000 1010)+(1000 1010)=1001 0100 = -20 结果显然不对,所以原码不适合做减法
使用反码:
10 -10 = 10+(-10)= (0000 1010)+(1111 0101)= 1111 1111 = -0 ,虽然-0和+0都是一样的,但是0是没有负0的说法的,所以反码也不适合做减法
使用补码:
10 -10 = 10+(-10)= (0000 1010)+(1111 0110)= 0000 0000 = 0 ,结果是正确的,表示方式也是正确的,所以补码适合做减法。
8位2进制 原码和反码可以表示的范围[-127,127],补码可是表示范围[-128,127]
-127-1= -127+(-1) = 1000 0001 + 1111 1111 = 1000 0000
数 | 原码 | 反码 | 补码 |
---|---|---|---|
0 | 0000 0000和1000 0000 | 0000 0000和1111 1111 | 0000 0000 |
1 | 0000 0001 | 0000 0001 | 0000 0001 |
-1 | 1000 0001 | 1111 1110 | 1111 1111 |
127 | 0111 1111 | 0111 1111 | 0111 1111 |
-127 | 1111 1111 | 1000 0000 | 1000 0001 |
-128 | 无 | 无 | 1000 0000 |
Kotlin技术专栏
目前正在使用Kotlin开发Android项目,并建立了Kotlin技术专栏,希望可以和大家一起学习,探讨和分享自己的实战经验