原码
原码是十进制数据的二进制表现形式,最左边是符号位,0为正,1为负。
最大值127的原码为0111 1111
。
最小值-127原码为1111 1111
。
利用原码对正数进行计算不会有问题,但如果是对负数计算,结果就出错。
1000 0000 -0
+ 0000 0001 +1
-----------
1000 0001 -1(正确值:+1)
反码
为了解决原码不能计算负数的问题,出现了反码。
正数的反码不变,负数的反码符号位不变,其余位取反,0变1,1变0。
十进制数字 | 原码 | 反码 | 补码 |
---|---|---|---|
+0 | 0000 0000 | 0000 0000 | 0000 0000 |
-0 | 1000 0000 | 1111 1111 | 0000 0000 |
-1 | 1000 0001 | 1111 1110 | 1111 1111 |
-2 | 1000 0010 | 1111 1101 | 1111 1110 |
... | ... | ... | ... |
-127 | 1111 1111 | 1000 0000 | 1000 0001 |
-128 | 无 | 无 | 1000 0000 |
反码也有弊端,在进行负数计算的时候,如果结果不跨0,是没有问题的,但是如果结果跨0,跟实际结果会有1的偏差。
1111 1101 -2 | 1111 1101 -2
+ 0000 0010 +2 | + 0000 0011 +3
----------- | ---------
1111 1111 -0 | 0000 0000 +0(正确值:+1)
补码
虽然+0和-0是一样的,但0带符号没有任何意义,而且会有两个反码表示0。于是补码的出现,解决了0的符号以及两个编码的问题,解决了负数计算跨0的问题。
正数的补码不变,负数的补码在其反码的基础上+1。补码能多记录一个特殊值-128,该数据在1个字节下,没有原码和反码。
计算机中的存储和计算都是以补码的形式进行的。