002 有符号数补码加法的位扩展

原码,反码,补码

  • 正数的原码、反码、补码相同
  • 原码:最高位表示正负(0正1负),其他位表示数
  • 反码:负数的反码,符号位不变,其他位按位取反
  • 补码:负数的补码,符号位不变,其他位按位取反
  • 用4位二进制表示3:0011(原码,反码,补码)
  • 用4位二进制表示-3:1011(原码),1100(反码),1101(补码)
3位二进制对应的原码,反码,补码对照表
二进制 原码 反码 补码 十进制
000 0 0 0 0
001 1 1 1 1
010 2 2 2 2
011 3 3 3 3
100 -0 -3 -4 4
101 -1 -2 -3 5
110 -2 -1 -2 6
111 -3 -0 -1 7

n为二进制数的反码f与十进制数d的关系如下
f = { d if  x > = 0 d + 1 − 2 n if  x < 0 f=\begin{cases} d &\text{if } x>=0 \\ d + 1 - 2^n &\text{if } x<0 \end{cases} f={dd+12nif x>=0if x<0

反码其实是用来解决负数的问题的,有了反码,绝对值相同,符号相反的两个数相加,结果是111,也就是-0,但这样0有两个,不太好,所以补码在反码的基础上加1,相加后结果是1000,又绕回来000了,这样0就只有两个。

如果一个正数(如010,2)加上一个绝对值比他小1的负数(111,-1),结果是001,刚好是正1,加上一个绝对值比他大1的负数(101,-3),结果是111,刚好是-1

为什么取反了减法就对了,是因为这个序列是一个环,000->001->010->…->111->000。
002 有符号数补码加法的位扩展_第1张图片
整数的加减法其实就是点在坐标轴的移动,二进制的补码相当于对-4到3进行了重新编码,编码后的补码同样是顺序码,每个码之间相差一个单位,所以补码的加减法可以直接运算
比如-1加-2,相当于6+7,应该是13,但溢出了,因此取(13%8)=5

原码的加减法

2 +(-2)= 010 + 110 = 000(0,正确)
2 +(-3)= 010 + 111 = 001(1,错误)

补码的加减法

2 +(-2)= 010 + 110 = 000(0,正确)
2 +(-3)= 010 + 101 = 111(-1,正确)

补码减法直接运算即可获得正确结果

有符号数补码加法的位扩展

两个3位有符号补码相加,其结果最小值是100(-4)+100(-4)=1000(-8),最大值011(3)+011(3)=0110(6),要用4位二进制表示,Verilog代码实现如下:

reg[2:0] a, b;
reg[3:0] c;
assign c = {a[2], a} + {b[2], b};

假如a是0或者正数,高位扩展的是0,补码肯定是正确的,假如a是负数

3位二进制 4位二进制 补码
100 1_100 -4
101 1_101 -3
110 1_110 -2
111 1_111 -1

从表中可以看出,在最高位补了一位符号位

你可能感兴趣的:(数字电路,补码,有符号数加法)