为什么会有这些编码方式?
计算机在进行运算时,为了提高效率,会把减法改成加上对应负数的方式进行运算。如:1-1会转换为1+(-1)的方式进行运算。负数在计算机中的表示方式为最高位用1表示,正数为最高位0,如果正常运算的话,如上的计算会出现不正确的情况。为了解决这个问题,就出现了这几种编码方式。
一、原码
最高位是符号位,其他位是数值的大小。
- 正数
最高位用0表示,其他位表示数值
如:1 (0000 0001) - 负数
最高位用1表示,其他位表示数值
如:-1 (1000 0001)
二、反码
最高位是符号位,其他位是数值的大小,但是正负数的表示不同。
- 正数
最高位用0表示,其他位表示数值
如: 1 (0000 0001) - 负数
最高位用1表示,其他位取反
如:-1 (1111 1110)
三、补码
最高位是符号位,其他位是数值的大小,但是正负数的表示不同。
- 正数
最高位用0表示,其他位表示数值
如:1 (0000 0001) - 负数
最高位用1表示,其他位取反后加1
如:-1 (1111 1111)
四、运算举例
1、原码
(1 - 1)10 = (0000 0001)2 + (1000 0001)2 = (1000 0010)2 = (-2)10
此时,运算结果为-2,显然不正确。
2、反码
(1 - 1)10 = (0000 0001)2 + (1111 1110)2 = (1111 1111)2 结果转换为原码 ,按位取反(1000 0000)2 = (-0)10 此时,运算结果为-0,发生了负零的情况,显然不是我们要的结果。
3、补码
(1 - 1)10 = (0000 0001)2 + (1111 1111)2 = (0000 0000)2 结果转换为原码 ,因为是正数所以也是(0000 0000)2 = (0)10 此时,运算结果为0,这就是我们最终希望的结果。
由此可以看出,计算机在进行加法乘除运算时,可以用各种编码进行,但是进行减法时,只能将数值转换为补码进行计算,也就是说正数的表示各种编码都一样,负数的表示各编码有所不同