购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.1.2 数值的编码

编码是用文字、符号或者数码来表示某种信息(数值、语言、操作指令、状态等)的过程。组合0和1数码就是二进制编码。用0和1数码的组合在计算机中表达的数值称为机器数,相应地,现实中真实的数值称为真值。对数值来说,主要有两种编码方式:定点格式和浮点格式。定点整数是本书的主要讨论对象,浮点实数将在9.1节介绍。

1.定点整数

定点格式固定小数点的位置表达数值,计算机中通常将数值表达成纯整数或纯小数,这种机器数称为定点数。对于整数,可以将小数点固定在机器数的最右侧,实际上并不用表达出来,这就是整数处理器支持的定点整数,如图2-4所示。如果将小数点固定在机器数的最左侧就是定点小数。

图2-4 定点整数格式

定点整数如果不考虑正负,只表达0和正整数,就是无符号整数(简称无符号数)。在前面的数值转换和运算中,就默认采用无符号整数。8位二进制数有256个编码,依次是00000000、00000001、00000010…11111110、11111111,采用十六进制形式表示,依次是00、01、02…FE、FF,所表达的无符号整数的真值依次是0、1、2…254、255。 N 位二进制共有2 N 个编码,表达的真值范围为0~2 N -1。因此,16位和32位二进制数所能表示的无符号整数范围分别是0~2 16 -1和0~2 32 -1。

如果要表达数值正负,则需要占用一个位,通常用机器数的最高位(故称为符号位),并用0表示正数、1表示负数,这就是有符号整数(简称有符号数、带符号数)。

2.补码

有符号整数有多种表达形式,计算机中默认采用补码(2′s Complement)。因为采用补码,减法运算可以变换成加法运算,所以硬件电路中只需设计加法器。

补码中,最高位表示符号,0表示正数,1表示负数;正数补码与无符号数一样,直接表示数值大小;负数补码是将对应正数补码取反(将0变为1,将1变为0),然后加1形成。例如:

正整数105用8位补码表示为:

[105] 补码 =01101001B

负整数-105用8位补码表示为:

[-105] 补码 =[01101001B] 取反 +1=10010110B+1=10010111B

一个负数的真值用机器数补码表示时,需要一个“取反加1”的过程。同样,将一个最高位为1的补码(即真值为负数)转换成真值时,也需要一个“取反加1”的过程。例如:

补码:11100000B

真值:-([11100000B] 取反 +1)=-(00011111B+1)=-00100000B=-2 5 =-32

进行负数求补运算,在数学上等效于用带借位的0做减法(下面等式中用中括号表达借位)。例如:

真值:-8。补码:[-8] 补码 =[1]0-8=[1]00000000B-00001000B=11111000B

补码:11111000B。真值:-([1]00000000B-11111000B)=-00001000B=-8

注意,求补只针对负数进行,正数不需要求补。另外,十六进制更便于表达,上述运算过程可以直接使用十六进制数。

由于符号要占用一个数位,因此8位二进制补码中只用7个数位表达数值,其所能表示的数值范围是-128~-1、0~+127,对应的二进制补码是10000000~11111111、000000000~011111111,若用十六进制表达是80~FF、00~7F。16位和32位二进制补码所能表示的数值范围分别是-2 15 ~+2 15 -1和-2 31 ~+2 31 -1。用 N 位二进制编码有符号整数,表达的真值范围是-2 N -1 ~+2 N -1 -1。使用补码表达有符号整数,和无符号整数表达的数值个数一样,但范围不同。

3.补码运算

数学家早已发现,对 N 位十进制做减法运算,即被减数-减数=差,可以转换为加法,即被减数+(10 N -减数),其中(10 N -减数)是10的补码,丢弃进位就是差值。例如,126-8=118。126+(10 3 -8)=[1]118,不要进位就是结果:118。这个方法可以扩展到二进制运算,用于简化计算机的算术运算:

[X] 补码 +[Y] 补码 =[X+Y] 补码 [X] 补码 -[Y] 补码 =[X] 补码 +[-Y] 补码 =[X-Y] 补码

图2-5展示了4个8位二进制数据的加减运算。从中可以看到,利用无符号数加法结合补码表达,除可以实现无符号数加法之外,也可以实现无符号数减法,还可以实现有符号数的加法和减法操作。对于无符号数加减运算,需要利用进位或借位才能得到正确结果;而对于有符号数加减运算,如果出现溢出,则结果是错误的。关于进位和溢出的详细讨论参见3.2节。

图2-5 补码运算示例

4.原码和反码

原码和反码也是表达有符号整数的编码。正数的原码和反码与补码和无符号数一样,而负数的原码是对应正数原码的符号位改为1,负数的反码是对应正数反码的取反。所以,求负数的原码、反码和补码,都需要首先计算其对应正数的编码,然后取反符号位(设置为1)成为原码,再取反其他位得到反码,最后加1就是补码。例如:

真值:32。机器数:[32] 原码 =[32] 反码 =[32] 补码 =00100000B=20H

真值:-32。机器数:[-32] 原码 =10100000B=A0H,[-32] 反码 =11011111B=DFH,[-32] 补码 =11100000B=E0H

使用原码和反码进行加减运算时比较麻烦,另外数值0都有两种表达形式。 VDnmpKU7jmP3R/t6PdA34VCADxwi4WCbvbXB805RuYZc2UtEjDkfeMiyzCZ8Uy7L

点击中间区域
呼出菜单
上一章
目录
下一章
×