What & How & Why

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
后一修订版
前一修订版
cs:comp_n_arch:courses:fnti_i:week_2 [2024/04/17 13:05] – [Binary Addition] codingharecs:comp_n_arch:courses:fnti_i:week_2 [2024/04/17 13:58] (当前版本) – [Signed Bit(原码)] codinghare
行 39: 行 39:
 {{ :cs:comp_n_arch:courses:fnti_i:addition_2.jpg?200 |}} {{ :cs:comp_n_arch:courses:fnti_i:addition_2.jpg?200 |}}
 ===overflow=== ===overflow===
 +如果最后一位相加也需要进位,此时结果长度超出了字的长度。我们称该情况为加法溢出(//overflow//)。解决的方式是:忽略所有额外的进位。从计算机的角度来考虑,如果加法超出了字长的限制,那么我们做的加法,就不再是真正的加法了。 
 +===Adder 的设计=== 
 +从这个思路出发,Adder 的设计分为: 
 +  * Half Adder:负责两个 Bit 的相加 
 +  * Full Adder:负责三个 Bit,即两个 Bit 与 carry 的相加 
 +==Half Adder== 
 +//Half Adder// 完成的工作是将两个 Bits 相加。那么: 
 +  * 输入:两个 bits 
 +  * 输出:一个 bit (和),一个 carry(进位) 
 +需要注意的是,两个 Bits 相加只和当前的 Bit 有关。只要是 ''1 + 1'',那么进位就是 ''1'',结果就是 ''0''。因此,我们可以得到如下的真值表: 
 +\\ \\  
 +{{ :cs:comp_n_arch:courses:fnti_i:half_adder.svg?240 |}} 
 +==Full Adder== 
 +//Full Adder// 完成的工作是将两个 Bits 与 carry 位相加: 
 +  * 输入:bit a, b, c 
 +  * 输出:sum, carry 
 +其真值表也非常容易得到: 
 +\\ \\  
 +{{ :cs:comp_n_arch:courses:fnti_i:full_adder.svg?270 |}} 
 +==Multi-bit Adder(16bits)== 
 +这个 adder 由一系列的 half adder 和 full adder 组成。准确的来说,是 15 个 full adder 与 1 个(最右边的)half adder 组合在一起,组成了 16 bits 的,带进位的加法计算器。 
 +====Negative Numbers==== 
 +表示负数的方式有三种: 
 +  * signbit(原码) 
 +  * Complement (补码) 
 +===Signed Bit(原码)=== 
 +这种方式使用二进制的最高位作为符号位,以此来区分正负数。其他位不变,比如: 
 +<code cil> 
 +000 -> 0 100 -> -0 
 +001 -> 1 101 -> -1 
 +010 -> 2 110 -> -2 
 +011 -> 3 111 -> -3 
 +</code> 
 +这种方法通常不会采用,有几个大的缺点: 
 +  * ''-0'' 的定义,它与 ''0'' 的区别无法解释 
 +  * 加减法无法处理。比如 ''1 + (-1)'',也就是 ''001 + 101'', 结果是 ''110'',为 ''-2'', 不是 ''0''