What & How & Why

差别

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

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
后一修订版
前一修订版
cs:comp_n_arch:courses:fnti_i:week_2 [2024/04/17 12:53] – [Decimal to Binary] codingharecs:comp_n_arch:courses:fnti_i:week_2 [2024/04/17 13:58] (当前版本) – [Signed Bit(原码)] codinghare
行 31: 行 31:
 \\ \\  \\ \\ 
 ====Binary Addition==== ====Binary Addition====
 +二进制的加法与十进制类似,按位相加:
 +\\ \\ 
 +{{ :cs:comp_n_arch:courses:fnti_i:addition.jpg?150 |}}
 +\\ \\ 
 +如果遇到 ''1+1'' 的情况,则进位。进位是逢 ''2'' 进 ''1''
 +\\ \\ 
 +{{ :cs:comp_n_arch:courses:fnti_i:addition_2.jpg?200 |}}
 +===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''