原码、反码、补码
原码、反码、补码
全篇以一字节(8位)为例
机器数和真值
机器数:一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,最高位存放符号, 正数为0, 负数为1。如数5
、-5
(十进制)分别转换成8位二进制为0000 0101
、10000101
真值:将带符号位的机器数对应的真正数值称为机器数的真值。如有符号数10000101
真正数值为-5
,而不是133
原码
定义:最高位为符号位,1 表示负数,0 表示正数。其余比特位表示值。
+5[原码]: 0000 0101
-5[原码]: 1000 0101
存在问题
负数计算出错
使用原码计算5-3
:
假设我们要计算 (5 - 3) 的原码表示。
表示数字:
- (5) 的原码是
0000 0101
(正数)。 - (3) 的原码是
0000 0011
(正数)。
- (5) 的原码是
取负数:
- ( -3 ) 的原码是
1000 0011
(负数)。
计算:
0000 0101
+ 1000 0011
---------------
1000 1000结果分析:
- 结果
1000 1000
表示负数,得到的真值是 -8。结果不正确,原码在减法操作中的复杂性和易出错性。
- 结果
零不唯一
在原码表示中,零的表示确实是不唯一的。
正零:
- 正零的原码表示为
0000 0000
(最高位为0)。
- 正零的原码表示为
负零:
- 负零的原码表示为
1000 0000
(最高位为1)。
- 负零的原码表示为
反码
正数的反码与原码相同,而负数的反码是对原码中数值位每一位进行取反
- +5 [反码]:00000101(与原码相同)
- -5 [反码]:
- 原码: 10000101
- 反码: 11111010(数值部分每位取反)
反码计算
1.反码运算时,其符号位与数值一起参加运算。
2.反码的符号位相加后,如果有进位出现,则要把它送回到最低位去相加(循环进位)。
3.用反码运算,其运算结果亦为反码。在转换为真值时,若符号位为0,数位不变;若符号位为1,应将结果求反才是其真值。
0000 0101 (5) |
0000 0010的真值为2,结果正确
问题
零不唯一
反码有正零(0000000000000000 )和负零(1111111111111111)两个表示
加法复杂性
在反码加法中,必须处理进位和符号位,增加了运算的复杂性。
补码
正数的补码和它的原码相同,负数的补码 = 数值位逐位求反(反码) + 1 (+1是在最后的位置加一,即使是小数的最后位置)
补码的第一位不仅代表符号位,还代表了权值
+5[补码]= 0000 0101
-5[补码]:
- 原码: 10000101
- 反码: 11111010(数值部分每位取反)
- 补码: 1111 1011 (反码+1)
例:小数的补码
正数 5.625 的二进制表示:
- 整数部分 5 = 101
- 小数部分 0.625 = 0.101(通过反复乘以 2 得到)
所以,5.625 的原码为:101.101
表示为补码:
- 首先,正数 5.625 的原码为
00000101.101
(假设使用 8 位整数部分和 3 位小数部分)。 - 反码(对符号位不变,数值部分取反):
- 整数部分取反:
11111010.010
- 整数部分取反:
- 补码(反码 + 1):
11111010.010
+0.001
=11111010.011
-5.625 的补码为
11111010.011
- 首先,正数 5.625 的原码为
零唯一
零的表示是唯一的,即 0000 0000,正零和负零都用相同的表示,这样避免了反码中存在的两个零表示的问题
补码计算
计算 (5 - 3) 的补码方法如下:
表示 (5):
- 原码:(0000 0101)
- 补码:(0000 0101)
表示 (-3):
原码:(1000 0011)
反码:(1111 1100)
补码:(1111 1101)(反码加 (1))
相加:
0000 0101 (5)
+ 1111 1101 (-3的反码)
1 0000 0010 ----舍去进位---->0000 0010
结果是 (0000 0010),即 2,表示 5 - 3 = 2,结果正确。