What & How & Why

差别

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

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
后一修订版
前一修订版
cs:comp_n_arch:courses:fnti_i:week_2 [2024/04/17 12:36] codingharecs:comp_n_arch:courses:fnti_i:week_2 [2024/04/17 13:58] (当前版本) – [Signed Bit(原码)] codinghare
行 5: 行 5:
 二进制数以 ''0'',''1'' 的组合表示各式各样的数据:''n'' 位二级制数拥有 $2^n$ 的组合数量。 二进制数以 ''0'',''1'' 的组合表示各式各样的数据:''n'' 位二级制数拥有 $2^n$ 的组合数量。
 ===二进制表示数字=== ===二进制表示数字===
-==二进制转十进制==+==Binary to Decimal==
 二级制按照如下的规则转化为十进制: 二级制按照如下的规则转化为十进制:
   * 从左到右,从 0 开始,每一位的权为 $2^n$   * 从左到右,从 0 开始,每一位的权为 $2^n$
行 15: 行 15:
 \\ \\  \\ \\ 
 也就是如果有 ''k'' 位 Bit,最大能表达的数字为: 也就是如果有 ''k'' 位 Bit,最大能表达的数字为:
-$$ +
-可以写成:+
 $$ $$
 1 + 2 + 4 +...+2^{k-1} = 2^k - 1 1 + 2 + 4 +...+2^{k-1} = 2^k - 1
 $$ $$
-$$+==Fied word size== 
 +计算机中字的长度是有限的,因此表示的范围也是有限的。理想情况下,一个 ''8'' 位的字可以表示 $2^8 = 256个数字;但实际上,如果需要表示负数,那么 ''8'' 位的其中一位就会作为符号位,这样 8 bit 只能表示 ''0-127'' 
 +==Decimal to Binary== 
 +按之前转化的逆顺序: 
 +  * 找出当前 10 进制中最大的,可以通过 ''2^n'' 计算出的数 
 +  * 从当前数中减去该数 
 +  * 重复上面两步,直到只剩 ''1''($2^0$) 
 +这个过程相当于是在还原二级制构造十进制的过程。因此,之前能找出来的数证明其对应的 Bit 上都是 ''1'',反之都是 ''0''。以 ''87'' 位例: 
 +\\ \\  
 +{{ :cs:comp_n_arch:courses:fnti_i:10_to_2.svg?400 |}} 
 +\\ \\  
 +====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''