计算机组成原理|数位数制和编码

蝶儿导读
计算机组成原理中,数位数制与编码是数据表示的核心基础。文章系统介绍了二进制(B)、八进制(O)、十进制(D)和十六进制(H或0x)的定义及相互转换方法,包括二进制转十进制的位权计算、十进制小数转二进制的乘2取整法,以及二进制与八进制、十六进制的分组转换规则。同时详细阐述了BCD编码(8421码)的加法修正、ASCII的7位字符编码原理、奇偶校验码机制,以及原码、补码、反码、移码的表示规则和浮点数在IEEE 754标准下的结构特点,涵盖定点数与浮点数的精度与范围问题。
— 此摘要由蝶儿创作,她也可能会犯错。

数位数制

在计算机科学中,有以下几种经常会用到的数制:

  • 二进制 Binary(符号 B,逢二进一)
  • 八进制 Octal(符号 O,逢八进一)
  • 十进制 Decimal(符号 D,逢十进一)
  • 十六进制 Hexadecimal(符号 H 或 0x,逢十六进一)

以上。

数制表示转化

二进制转十进制

二进制转十进制的计算方法为 各位值 \(\times\) 其位权。二进制各位的位权如下参考:

以将二进制的 10010.110 转为十进制为例,用上述公式可表达为:

$$
1 \times 2^4 + 0 \times 2^3 + 0 \times 2^2 + 1 \times 2^1 + 0 \times 2^0 + 1 \times 2^{-1} + 1 \times 2^{-2} + 0 \times 2^{-3} = 18.75
$$

其中注意:若一个数的次方数小于 0 的计算方法为:先计算该数的倒数,然后求次方数的绝对值。在本次课中,可进一步简化记忆:计算小数点后的位权时,其位权可参考下图:

十进制转二进制
小数部分十进制转二进制

设十进制小数为 x,则将 x 乘以 2 并记录整数部分,剩下的纯小数部分继续乘以 2 记录整数部分,直到小数变为 0 或达到所需精度。以将十进制的 0.625 转为二进制为例:

步骤当前值 \(\times\) 2整数部分小数部分
1\(0.625 \times 2 = 1.250\)10.250
2\(0.250 \times 2 = 0.500\)00.500
3\(0.500 \times 2 = 1.000\)10.000

计算得十进制的 0.625 = 二进制的 0.101。

二进制和八进制、二进制和十六进制转换

由于这三种进制的转换相对容易,因此我们将其一并讲解:

  • 二进制转八进制
    以小数点为中心向两侧转换,每 3 个二进制数为一组,每一组从左往右看,对应一个八进制数。不足的则补 0。
  • 八进制转二进制
    将八进制数的各数逐一转为二进制,每个八进制数可以转为一组 3 个二进制位的二进制数。
  • 二进制转十六进制
    以小数点为中心向两侧转换
    ,每 4 个二进制数为一组,每一组从左往右看,对应一个十六进制数。不足的则补 0。
  • 十六进制转二进制
    将十六进制数的各数逐一转为二进制,每个十六进制数可以转为一组 4 个二进制位的二进制数。
十进制和八进制、十六进制的转换

先将初始数转为二进制数,然后由二进制数中转转为对应目标进制数。

特别注意

特别注意

编码

在计算机中,常用的编码是 BCD 编码。即用 4 位二进制数来表示 1 位十进制数码。在 BCD 码中,我们常用的是 8421 编码:

十进制0123456789
8421
编码二进制
0000000100100011010001010110011110001001
十进制10111213141516171819
8421
编码二进制
0001 00000001 00010001 00100001 00110001 01000001 01010001 01100001 01110001 10000001 1001
8421 码的加法运算

8421 码的加法运算是将两个 8421 编码的二进制数进行直接相加,相加后的值每 4 位为一组表示一个十进制数;若某一组不在映射表中,则需将这一组 +6(+0110)进行修正。

示例:求解 59 + 73

$$
\begin{eqnarray}
&\left \{ \begin{array}{l}
59 = 0101\ 1001 \\
73 = 0111\ 0011 \\
\end{array} \right. \\
\\
&1100&(9)\\
+&0011&(3)\\
= &1\ 0010&(12)\\
\\
&0101&(5)\\
+&0111&(7)\\
+&0001&(\text{进位})\\
=&1\ 1101&(13 \mathbb{{\color[RGB]{255,67,67}\text{[非法]}}})\\
+&0110&(6)\\
=&1\ 0011&\\
\text{则最终结果为:} &1\ 0011\ 0010\\
\end{eqnarray}
$$

这是因为十进制一个数位只有 0 – 9 共十个状态,而 8421 码的四个二进制数可以表示 16 个状态,故非法时 +6 将 10 – 15 这十五个十进制非法的数跳过进位到下一位继续计算。

ASCII 美国信息交换标准代码

ASCII 使用 7 位二进制编码来表示 128 中字符。该编码下所有大写字母、小写字母和数字的编码都是连续编码的。以下以 ASCII 的十进制编码为例进行说明:

  • ASCII 中的 A
    A 是大写字母连续编码的第一位,在 ASCII 中的编码为 65,其后 B 为 66,C 为 67……
  • ASCII 中的 a
    a 是小写字母连续编码的第一位,紧跟在大写字母 Z(96)后,在 ASCII 中的编码为 97,其后 b 为 98,C 为 99……
  • ASCII 中的 0-9
    0 是数字连续编码的第一位,在 ASCII 中编码为 48,其后 1 为 49,2 为 50……

在计算机中,所有字符以 ASCII 编码的形式存储于对应的存储单元中。例如已知一个字符存储在某存储单元中,题目若问该存储单元存放的内容是什么,则仅需求解该字符对应的 ASCII 编码的二进制形式并回答即可。

校验码

信息

校验码指能够发现或自动矫正错误的数据编码,它通过增加一些冗余码进行检验或纠错编码。

奇偶校验码

奇偶校验码通过在信息位后添加一位二进制位组成校验码。

  • 奇校验码
    整个校验码中有效信息位和校验位中 1 的个数为奇数
  • 偶校验码
    整个校验码中有效信息位和校验位中 1 的个数为偶数

在求某一段编码的奇偶校验码时,若求奇校验码,则确保原本编码+添加的奇偶校验码中所有 1 的个数为奇数;若求偶校验码,则反之确保所有 1 的个数为偶数

例如求 1011010 的奇校验码(设最高位为校验位),此时数其中 1 的个数:

1 0 1 1 0 1 0

为 4 个(此时为偶数个 1),则需要在最左侧(最高位)添加 1 以让整个编码变为:

1 1 0 1 1 0 1 0

共 5 个 1(奇数个 1)。其它同理。

定点数

信息

定点数是小数点的位置在整个数值表示中是「事先约定固定不变」,不随数值改变而移动。

  • 定点整数
    为纯整数,小数点在所有数值位的最右边(一般隐藏不显示)。
  • 定点小数
    为纯小数,所有有效数位都在小数点后,即所有数值都表示小数。

原码, 补码, 反码, 移码

原、补、反、移码是一组计算机中最重要的编码。

原码和反码

原码用机器数的最高位表示数的符号(0 正 1 负),其余位表示数的绝对值。反码的正数部分与原码相同,负数部分原码的符号位不变,其余数值部分全部取反(即 0 1 互换)。

例如对于 +213 这个数的表示,如下图所示:

当一个数是正数时,原、反码的表示

而对于 -169 这个数的表示则如下图所示:

当一个数是负数时,原、反码的表示

特别注意

补码和移码

对于正数,补码与原码相同。对于负数,原码的符号位不变,其余数值部分全部取反并在末尾(一般为最右侧)加 1。此方法亦可反过来求负数补码的原码:末位 -1,然后取反得到负数补码的原码。

例如上图中原码 1, 1010 1001 的补码为 1, 01010111

移码是由补码的符号位取反得到。移码仅可用于表示定点整数

特别注意

浮点数表示

浮点数用于解决定点数「范围大没精度,精度高范围小」的问题。其核心思想是像科学计数法一样用「\(\text{尾数} \times \text{基数}^{\text{指数}}\)」来表示数值:

一个典型浮点数由 3 部分组成:数符阶码尾数

  • 数符
    确定待表示数的正负性。0 为正,1 为负。数符只管正负,不管大小
  • 阶码
    指数部分,用来表示尾数的定点小数小数点移动位数。阶码决定数值范围阶符是阶码的符号位,用于表示阶码的正负性。
  • 尾数
    尾数通常为定点小数,且尾数的原码最高位为 1(反码和补码的最高位为 0),表示有效数字本身部分。尾数决定数值精度

例如一个尾数为 0.1001,则其十进制为:

$$\frac{1}{2} + \frac{1}{8} + \frac{1}{16} = 0.6875$$

一个十进制数 13.25,其二进制为 1101.01(此处 0.25 的二进制为 0.01,因为 \(2^{-2} = 1\frac{2^2} = 0.25\));将其规范为浮点形式为:

$$ 0.110101 \times 2^4 $$

IEEE 754 标准

根据 IEEE(电气电子工程师学会)754 标准,常用的浮点数格式为:

数符位于最左(最高)位,数符后是阶码部分,用移码表示;阶码后是尾数数值位用原码表示

因为尾数用原码表示,且最高位恒为 1,因此 IEEE 754 标准的单精度和双精度浮点数(float 和 double)采用隐含尾数最高数位(即隐藏表示尾数最高数位)方法以节约尾数位空间,多表示一位尾数。临时浮点数无隐含位。

阶码是以移码的形式存储的,阶码具有偏置值:单精度的指数位数为 8,偏置值 127;双精度的指数位数为 11,其偏置值为 1023。因此:

该种方式确保实际存储的阶码 E 为正,即一个浮点数的阶码区域不用占用符号位,节约存储空间和提高效率。

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注