\quad
一. 补码加减运算器
\quad
以上是4bit+4bit的加法器
如果要进行8bit+8bit就可以在左边再连一个加法器
\quad
\quad
补码减法的实现
Sub为控制信号, 当要进行加法运算的时候就给多路选择器0, 反之给1
同样的,要进行加法,Sub给Cin的值为0, 减法时给1(按位取反后加的1就是在这里加的)
当多路选择器是0的话, 就是进行补码加法运算, 和上面一样
当多路选择器是1的话, 就是进行补码减法运算, 我们可以看到多路选择器的左边是非门, 将Y全部位按位取反, 之后再加来自Cin的1, 再与x进行加法运算
错误的原因是产生溢出
一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一
D是十进制的后缀
我们发现同样可以使用的加法器, 但是计算结果却是错的, 这就涉及到标志位的生成
\quad
二. 溢出判断
\quad
也就是说(同+同=异)就会发生溢出
\quad
\quad
其实正+正结果应该为正的, 而实际得出的却是负的则为上溢
产生溢出的原因是位数不够, 那么我们应该如何增加位数呢
\quad
\quad
整数的扩展方式
\quad
\quad
小数的扩展方式
把短数据变成长数据, 所能表示的范围和数值的精度都会有所扩展, 在一定程度上可以避免溢出
\quad
三. 标志位的生成
\quad
两个nbit相加除了输出nbit的结果之外, 还输出4个标志位
我们分别来看这4个标志位
\quad
我们先来看OF标志位
OF标志位是用来判断有符号数的加减有没有产生溢出, 有溢出OF=1, 无溢出OF=0
特别注意的是OF对无符号数的加减法没有意义, 即使是OF=1, 也并不能说明它溢出
\quad
\quad
SF标志位
SF=1 运算结果为负数
SF=0 运算结果为正数
\quad
\quad
ZF标志位 (对有符号数还是无符号数都是有意义的)
当运算的结果nbit都是0的话, 那么结果就为0, ZF=1
\quad
\quad
CF标志位 (只对无符号数加减法有意义)
\quad
特别注意:
OF和SF对应有符号数
CF对应无符号数