How
原码 | 反码 | 补码 | |
---|---|---|---|
正数 | 符号位+0 | 本身 | 本身 |
负数 | 符号位+1 | 符号位不变,其余取反 | 补码+1 |
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
why
为什么用原码
解决计算机不认识减法的问题,1-1变成1+(-1)
为什么不用反码
反码计算后,会出现+0和-0,不符合现实计算,而补码可以解决这个问题。使用补码, 不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数. 这就是为什么8位二进制, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127].因为机器使用补码, 所以对于编程中常用到的32位int类型, 可以表示范围是: [-231, 231-1] 因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值.
more
一个数的反码, 实际上是这个数对于一个膜的同余数. 而这个膜并不是我们的二进制, 而是所能表示的最大值! 这就和钟表一样, 转了一圈后总能找到在可表示范围内的一个正确的数值!而2+126很显然相当于钟表转过了一轮, 而因为符号位是参与计算的, 正好和溢出的最高位形成正确的运算结果.也就是2-1和2+126的结果在计算机内是相等的。而补码相当于增加了膜的值,即2-1 ≡ 2+127 (mod 128),解决了+0,—0的问题