0%

计算机基础之数据的机器级表示与处理

数据的机器级表示与处理

数制和编码

信息的二进制编码

计算机内部处理的所有数据都必须是数字化编码了的数据。

采用二进制表示方式的原因如下:

  • 二进制只有两种基本状态,使用有两个稳定状态的物理器件就可以表示二进制数的每一位,而制造有两个稳定状态的物理器件要比制造有多个稳定状态的物理器件容易得多。如用高低两个电位,脉冲的有无,脉冲的正负极性。
  • 二进制的编码,计数和运算规则都很简单
  • 两个符号 1 和 0 正好与逻辑命题的真假相对应,为计算机中实现逻辑运算和程序中的逻辑判断提供了便利的条件

机器指令的操作数只能是以下四种简单的基本数据类型:无符号定点整数,带符号定点整数,浮点数和非数值型数据

指令所处理的数据类型分为数值数据和非数值数据两种。数值数据可用来表示数量的多少,可比较其大小,分为整数和实数,整数又分为无符号整数和带符号整数,实数用浮点数表示。非数值数据是一个没有大小之分的位串,不表示数量的多少,主要用来表示字符数据和逻辑数据。

在计算机内部,数值的表示方法又两大类,第一种是直接用二进制数表示,另一种是采用二进制编码的十进制数(Binary Coded Decimal Number 简称 BCD)表示。

表示一个数值数据要确定三个要素:进位计数制,定/浮点表示和编码规则。

进位计数制

十进制数字可以表示成以上形式,10 称为基数,$10^i$ 称为第 i 位上的权,运算时采用逢十进一。

类似地,二进制数的基数是 2,运算时逢二进一。

以上规律可以扩展到 R 进制的数字系统。

进制转换相关不再赘述。

定点与浮点表示

定点表示

定点表示法用来对定点小数和定点整数进行表示,对于定点小数,其小数点总是固定在数的左边,一般用来表示浮点数的尾数部分。对于定点整数,其小数点总是固定在数的最右边。

浮点表示

对于任意一个实数 X,可以表示成如下形式:

其中 S 取值为 0 或 1,用来决定数 X 的符号;M 是一个二进制定点小数,称为数 X 的尾数(mantissa),E 是一个二进制定点整数,称为数 X 的指数;R 是基数(radix、base)。在基数 R 一定的情况下,尾数 M 的位数反映数 X 的有效位数,它决定了数的表示精度,有效位数越多,表示精度就越高,阶 E 的位数决定数 X 的表示范围,阶 E 的位数决定数 X 的表示范围;阶 E 的值确定了小数点的位置。

从浮点数的形式来看,绝对值最小的非零数是如下形式的数:$0.0···01R^{-11···1}$,而绝对值最大的数的形式应为 $0.11···1R^{11···1}$,所以假设 m 和 n 分别表示阶和尾数的位数,基数为 2,则浮点数 X 的绝对值的范围为:

浮点数的最小数是定点小数的最小数 $2^{-n}$ 去除一个很大的数$2^{2^m-1}$,而浮点数的最大数则是定点小数的最大数 $1-2^{-n}$乘以这个大数$2^{2^m-1}$

定点数的编码表示

定/浮点表示解决了小数点的表示问题,但是对于一个数值数据来说,还有一个正负号的表示问题。一般用 0 和 1 来表示数字的符号,称为符号数字化,一般规定 0 表示正号,1 表示负号。

通常将数值数据在计算机内部编码表示的数称为机器数,而机器数真正的值称为机器数的真值

约定一个机器数$X$的真值$X_T$用 n 位的二进制数编码,有以下方式:

原码表示法

一个数的原码表示由符号位直接跟数值位构成,称为“符号-数值”表示法。

原码编码规则如下

  • 当 $XT$为正数时,$X{n-1} = 0,X_i=X_i^” (0\leq i \leq n-2)$
  • 当 $XT$为负数时,$X{n-1} = 1,X_i=X_i^” (0\leq i \leq n-2)$

原码表示的优点是:与真值的对应关系直观,方便,用原码实现乘除运算也比较简便。

缺点是:0 的表示不唯一,加减法运算规则复杂。在加减运算过程中,要判定是否是两个异号数相加或两个同号数详见,若是,则必须判定两个数的绝对值大小,根据判断结果决定结果符号,然后用绝对值大的数减去绝对值小的数。现代计算机不用原码表示整数,只用定点原码小数来表示浮点数的尾数部分。

补码表示法

补码表示可以实现加减运算的统一,用加法来实现减法运算。计算机中,补码用来表示带符号整数,补码表示法也称为“2-补码”(two’s complement)表示法,由符号位后跟上真值的模$2^n$补码构成。

可以用以下方法求一个数的补码:对于正数,符号位取 0,其余各位同真值中对应的各位。对于负数,符号位取 1,其余各位由真值各位取反,末尾加 1 得到。

补码运算的推导

两个正数相加,两个负数相加,可能会出现溢出的情况。

变形补码

为了便于判断运算结果是否溢出,某些计算机中采用了一种双符号位的补码表示方式,也成为变形补码,或者模 4 补码。在双符号位中,左符是真正的符号位,右符用来判别溢出。

反码表示法

负数的补码可用各位求反,末尾加 1 得到,如果仅仅求反而不加 1,得到的是负数的反码表示。

反码表示存在以下不足:0 的表示不为 1,表数范围比补码少 1,运算时需考虑循环进位。

移码表示法

浮点数实际上使用两个定点数来表示的,用一个定点小数来表示浮点数的尾数,一个定点整数表示浮点数的阶。一般来说,浮点数的阶都用一种称为移码的编码方式,通常将阶的编码表示称为阶码

阶可以是正数,也可以是负数。当进行浮点数的加减运算时,必须先对阶,为了简化比较操作,在操作过程中不涉及阶的符号,可以对每个阶都加上一个正的常数,称为偏置常数(bias)

整数的表示

计算机中的整数分为无符号整数带符号整数两种。

省略有关 C 语言相关处理内容。

浮点数的表示

浮点数的表示范围

浮点数的表示范围

根据浮点数的格式格式,只要尾数为 0,阶码取任何值都为 0,这样的数被称为机器零。因此机器零不唯一。

浮点数的规格化

规格化数的标志是真值的尾数部分中最高位具有非零数字。

  • 右规 当有效数位进到小数点前面时,需要进行右规,右规时,尾数每右移一位,阶码+1
  • 左规 当尾数出现 $ 0.0···bbbb $的结果时,需要进行左规,右规时,尾数每左移一位,阶码-1
IEEE 754 标准

32 位包括 1 位符号位 8 位阶码 23 位有效位

64 位包括 1 位符号位 52 位有效位

规格化尾数最高位总是 1,所以隐含表示,省略一位

阶码使用移码表示 大小为 $2^{n-1}-1$

全 0 +0

符号位 1 之后全 0 -0

浮点数除 0 的结果是正负无穷大,而不是一出一场

0 11111111 00000000000000000000000 正无穷大

1 11111111 00000000000000000000000 负无穷大

Not a Number 非数 sqrt(-0.4) 0/0 使用全 1 的阶码和非 0 的尾数

非规格化数 阶码全 0 尾数非 0

十进制数的表示

ASCII

BCD 码

有权 BCD 码

每个十进制数位的 4 个二进制数位都有一个确定的权,它选取 4 位二进制按照计数顺序的前 10 个代码与十进制数字相对应。每位的权分别为 8,4,2,1,因此称为 8421 码,也称自然 BCD 码。

无权 BCD 码

无权 BCD 码是指每个十进制数位的 4 个基 2 码没有确定的权。如余 3 码和格雷码。

余 3 码是在 8421 BCD 数码的基础上每个码加上 3 (0011)形成的

格雷码在一组数的编码中,任意两个相邻的代码只有一位二进制数不同。最大数和最小数也仅有一位不同,即收尾相连。

数据的宽度和存储

数据的宽度和单位

机器字长是 CPU 内部用于整数运算时的数据通路的宽度,字长等于 CPU 内部用于整数运算的运算器位数和通用寄存器宽度。

描述距离,频率等数值通常用 10 的幂次表示,因而在由时钟频率计算得到的总线带宽或外设数据传输率中,度量单位表示的也是 10 的幂次,通常用 K 表示 1024,k 表示 1000,其他前缀字母均大写,表示大小由上下文决定。

数据的存储和排列顺序

一般用最低有效位最高有效位分别表示数的最低位和最高位。对于带符号的数,最高位就是符号位。

如果以字节为一个排列基本单位 LSB 表示 最低有效字节,MSB 表示 最高有效字节

排列方式有两种,大端和小端

小端方式将最高有效字节放在高地址单元,最低有效字节存放在地地质单元。Intel 80x86 采用小端方式。

数据的基本运算

!(x^y) 等价于表达式 x == y

左移运算和右移运算

C 的移位操作有逻辑移位算数移位

  • 逻辑移位不考虑符号位的问题,左移时,高位移出,低位补 0。右移时,低位移出,高位补 0。
  • 算数移位左移时,高位移出,低位补 0.右移时,低位移出,高位补符号。
位扩展运算和位截断运算

截断一个数可能因为溢出而改变它的数值。

整数加减运算

整数加法运算器通常包含以下输出标志:

  • 零标志 ZF,当结果所有位都是 0 时,ZF=1,否则,ZF=0
  • 溢出标志 OF,OF=1 表示带符号整数的加减运算发生溢出
    全加器 溢出标志的逻辑表达式
    $OF=Cn \oplus C(n-1)$
    因为若为两个正数相加,最高位必然没有进位,而若次高位有进位,则说明溢出 若为两个负数相加,最高位必然有进位,若次高位没有进位,则说明溢出
  • 符号标志 SF 一般取有符号数的最高位
  • 进/借位标志 CF 表示无符号数加减法时的进/借位。加法时,CF=1 表示加法有进位,减法时,CF=1 表示不够减。因此,加法时 CF 等于进位输出 C,减法时,CF 等于进位输出 C 的取反。
整数乘除运算

好难啊,看不懂,先坑着

常量的乘除运算

编译器在处理变量与常数相乘,往往用移位和加减法组合代替乘法运算。

浮点数运算

加减运算

计算机实现上述过程需要经过对阶,尾数相减,规格化和舍入四个步骤

阶码溢出判断
在进行尾数规格化和尾数舍入时,可能会对结果的阶码执行加减运算,必须考虑阶码的溢出问题。如果阶码全为 1,发生阶码上溢,此时可将结果置为无穷,若阶码全为 0,发生阶码下溢,此时可将结果置为 0。

乘除运算

无需对阶的步骤,但是对于结果的处理步骤是一样的。