计算机组成原理-计数制与定点数编码

进位计数制

r进制转10进制

设r进制数从左到右分别为 R(n) R(n-1) R(n-2) … R(1) R(0),则该进制数转换为十进制是

R(n)×r^n + R(n-1)×r^(n-1) + ... + R(1)×r + R(0)×1

当 r > 9 时,通常用大写字母来表示 10,11 等,例如 A=10, B=11

10进制转r进制

使用除余方法来转换进制

不断地将10进制数除以r,每次得到的余数都写在上次的余数之前,最后得到的数字就是r进制数

例如将 19 转换为 2 进制,不断地除以 2,得到的余数分别是

代码语言:javascript
复制
19 ÷ 2 = 9 ...... 1
 9 ÷ 2 = 4 ...... 1
 4 ÷ 2 = 2 ...... 0
 2 ÷ 2 = 1 ...... 0
 1 ÷ 2 = 0 ...... 1

因此最后结果是 10011

小数转换

r进制转10进制时,小数部分继续按照上面的公式计算即可,如二进制下的 0.1 转换成10进制是

0.1 × 2^(-1) = 0.5

十进制转r进制时,不断地将小数部分乘上r,并取整数部分,例如将 0.123 转换为 8 进制

代码语言:javascript
复制
0.123 × 8 = 0.984
0.984 × 8 = 7.872
0.872 × 8 = 6.976
0.976 × 8 = 7.808
0.808 × 8 = 6.464
...

因此转换结果是0.07676…

转换时出现无限小数是正常的,只需要保留有效位数即可

真值与机器数

真值是符合人类习惯的数字,是带有符号的

机器数是存粹的以数字形式保存的数字,它不带有任何符号,而是把符号也抽象为一个数字,例如用 1 表示正数,0 表示负数

考点总览

DearXuan

字符与字符串

ASCII码

英文字符在计算机中使用ASCII码表示

ASCII总共有128个字符,因此只需要7位,而在计算机中,使用一个字节表示一个ASCII字符,其中最高位置0

以下是ASCII码表

DearXuan

32~126为可印刷字符,其它字符为控制、通信字符

需要记忆的特殊位置有:

0: 48

A~Z: 65~90

a~z: 97~122

汉字编码

在1980年,中国推出了GB-2312标准,总共拥有7445个常用汉字

GB-2312标准采用区位码来表示汉字,共有94个区和94个位,区和位分别使用一个字节表示,一个汉字字符占两个字节

由于汉字编码也使用了ASCII中的控制字符,为了避免冲突,需要将区位码全部加上32,这样就避开了ASCII码中的控制字符区域,将区位码加上32就得到国标码(GB-2312)

为了避免国标码与ASCII码冲突,在存储时,需要将国标码全部加上128,这样所有的汉字都落到了128255的范围,而ASCII码全部落到了0127的范围,于是得到了汉字内码

在输入汉字时,采用输入码,例如拼音,五笔

在输出汉字时,采用字形码,字形码用来显示出汉字的图形

字符串

字符串就是一个字符类型的数组,在计算机中,根据字符位置,按顺序保存字符,通常用”\0”(00H)表示字符串结束

考点总览

DearXuan

定点数

定点数是指小数点位置固定不变的数,例如 12, 5.008

无符号数

无符号数是指整个字长的全部二进制位均为数值,而非符号。因此一个8位二进制数可以表示的范围是 0~255

在讨论无符号数时,如果没有特别说明,一律默认整数,而非小数

有符号数

有符号数的二进制位的最高位用于表示符号,称为符号位,通常用1表示正数,用0表示负数。后7位用于表示数值部分,称为尾数。

表示定点整数时,默认小数部分为0,此时小数点位于第8位后面,即末位的位权为2^0

表示定点小数时,默认整数部分为0。此时小数点位于第1位后面,即末位的位权位2^(-7)

原码

原码是指尾数用来表示真值的的绝对值,符号位 0/1 表示 正/负

已知27的二进制表示为 11011,如果用原码表示 +27,则应该是

0 0011011

已知0.875的二进制表示为 111,如果用原码表示 -0.875,则应该是

1 1110000

原码表示的范围为:整数-127~127,小数0~0.9921875

真值0具有两种原码表示形式,分别是 +0 和 -0

反码

反码的最高位也是符号位,当符号位为0时,反码与原码相同,当符号位为1时,反码的数值位与原码相反。无论是整数还是小数都一视同仁

代码语言:javascript
复制
原码:0 0011001
反码:0 0011001

原码:1 0011001
反码:1 1100110

同样反码的真值0也有两种形式

补码

对于正数来说,补码就是原码;对于负数来说,补码是反码末位加一

代码语言:javascript
复制
原码: 0 0011001
反码: 0 0011001
补码: 0 0011001

原码: 1 0011001
反码: 1 1100110
补码: 1 1100111(注意这里可能需要进位)

在补码中表示 -0 时,其反码是

1 1111111

在最低位加一并不断进位,则变成

0 0000000

最高位前面的1被丢弃,恰好就是 +0 的补码

因此在补码中真值0只有一种形式,即 +0 的形式。多出来的 -0 形式被特殊定义

如果用补码表示定点整数,则”1 0000000”表示-128

如果用补码表示定点小数,则”1 0000000”表示-1

使用补码能够让减法运算变得简单,因为在加减运算时,只需要将整个补码看作一个二进制数,然后连同符号位一起相加(无论是加法还是减法都是相加),最终得到的就是计算结果的补码

移码

移码只能用来表示整数,只需要把补码的符号位取反就能得到移码

移码的好处在于能够使用硬件快速比较大小

DearXuan

如上图所示,当符号相同时,随着数字的增大,移码数值位也在不断变大。因此在比较整数大小时,只需要按顺序从最高位开始注意比较即可

考点总览

DearXuan