原、反、补、移码
原码、补码、反码、移码的转换
求原码:先区分正负
- 去掉符号,正数前面+0
- 去掉符号,负数前面+1
x:+0010 1011 0100
x原:0 0010 1011 0100
y:-1100 0101 1001
y原: 1 1100 0101 1001
反码:先区分正负
- 去掉符号,正数前面+0
- 去掉符号,负数前面加个1,01求反
x:+0010 1011 0100
x原:0 0010 1011 0100
x补:0 0010 1011 0100
y:-1100 0101 1001
y原:1 1100 0101 1001
y补:1 0011 1010 0110
求补码:先区分正负
- 去掉符号,正数前面加个0,不用求反
- 去掉符号,负数前面加个1,求反,最后值+1
x:+0010 1011 0100
x原:0 0010 1011 0100
x补:0 0010 1011 0100
x反:0 0010 1011 0100
y:-1100 0101 1001
y原:1 1100 0101 1001
y补:1 0011 1010 0110
y反:1 0011 1010 0111
求移码:无需区分正负
- 在补码的基础上,不区分正负,符号位1变0,0变1
x:+0010 1011 0100
x原:0 0010 1011 0100
x补:0 0010 1011 0100
x反:0 0010 1011 0100
x移:1 0010 1011 0100
y:-1100 0101 1001
y原:1 1100 0101 1001
y补:1 0011 1010 0110
y反:1 0011 1010 0111
y移:0 0011 1010 0111
已知补码,求真值
- 先通过符号位区分正负
- 如果为正,则补码=原码
- 如果为负数,则补码的补码=原码
x补: 0 1100 0110
则x原: 0 1100 0110
y补: 1 0010 1000
[y补]补: 1 1101 1000
已知补码,求和/差值
公式[x ± y] 补 = ([x]补 + [±y]补 )mod 2n
溢出
溢出:通过正数求和或负数求和,所得到的数的结果超过计算机所能表达的最大值。
现象
正数求和,等于负数
负数求和,等于正数
exp
求和:
x1:0 1011 y1:0 1001
x1补:0 1011 y1补:0 1001
s1补 = x1补 + y1补
s1补 = 1 0100
两个正数相加,答案是负数,上值溢出
如何检验溢出?
检验溢出有两种方法
1.双位检验法
将符号位变为两位,通过观察两位符号位的异或关系[1]来判断,如果异或关系为1,则溢出。
双位检验法
例1:
x1:00 1011 y1:00 1001
x1补:00 1011 y1补:00 1001
s1补 = x1补 + y1补
s1补 = 01 0100
符号位做异或运算,结果为1,说明溢出
例2:
x2:00 0101 y2:00 0011
x2补:00 0101 y2补:00 0011
s2补 = x2补 + y2补
s2补 = 00 1000
符号位做异或运算,结果为0,说明未溢出
缺点:额外占用了一位空间
[1]异或取值结果:
x | y | x ⊕ y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
2.单位检验法
原理同双位检验法相同,只不过额外定义一个变量z,来储存额外的符号位,不在占用额外的空间。