1.2.3 计算机中数值的表示

通过前面的学习已经知道,计算机内部采用二进制表示数据。对于数值型数据,数据有正负和小数之分,因此必须解决有符号数、小数在计算机内部的表示。

1.有符号数与无符号数

由于计算机中只能存储0和1,所以数的符号也必须用0和1来表示。

现在假设一个数据用8位二进制表示,在表示无符号数据时,8位都用于表示数据,因此可表示的数据的范围是0~255(00000000~11111111)。

当表示有符号数时,需要占用一个二进制位来表示符号。约定二进制数的最高位(左边第一位)作为符号位,用“0”表示正数,“1”表示负数,这样,数的正负号就被数值化了。假设一个数据用8位二进制表示,此时可表示的数据的范围是-128~127(10000000~01111111)。例如:

表示数据+52。再如:

表示数据-52。

2.真值与机器数

通常,把数值在计算机中的二进制表示形式称为“机器数”,对于有符号数,因为最高位是符号位,数的形式值就不等于真正的数值,把带符号位的机器数对应的数值称为机器数的“真值”。例如,假设一个数据用8位二进制表示,则对于十进制数+105,由于其对应的二进制数是1101001,因此+105对应的机器数为01101001,而十进制数-105对应的机器数为11101001。

机器数有两个特点:

①机器数的位数固定,能表示的数值范围受到位数限制。例如,字长为8位的计算机,能表示的无符号数的范围是0~255,有符号数的范围是-128~127。由于机器数受字长的限制,因此当计算机运算结果超过机器数所能表示的范围时,就会产生“溢出”。

②用“0”表示正数,“1”表示负数,因此,机器数是连同数据符号一起数字化了的数据。

3.小数

在计算机中小数的表示有两种形式:定点表示法和浮点表示法。其中,定点表示法如图1-5所示。

图1-5 定点表示法

定点表示法是将小数点的位置固定在一个二进制数的某一位置。通常是将其固定在数的最前面,将数据表示为一个纯小数;或固定在数的最后面,将数据表示为一个纯整数。但在存储器件上并不存储小数点,只是隐含规定它就在此位置。

例如,将小数点固定在最前面:

表示数据+0.40625。再如,将小数点固定在最后面:

表示数据-52。

上述的定点小数表示法,只能表示纯小数或纯整数,而实际使用的数大部分是混小数,即小数点的前面和后面都有数据,因此用浮点数来表示这样的小数。

由于篇幅所限,本书不再详细介绍浮点表示法,其相关知识可以参考其他相关教材

4.定点数和浮点数

根据小数点位置固定与否,机器数又可以分为定点数和浮点数。通常,使用定点数表示整数,而用浮点数表示实数。

(1)整数

整数没有小数部分,小数点固定在数的最右边。整数可以分为无符号整数和有符号整数两类。无符号整数的所有二进制位全部用来表示数值的大小;有符号整数用最高位表示数的正负号,而其他位表示数值的大小。例如,假设数据用8位二进制表示,则十进制整数-65的计算机内部表示形式是11000001。

(2)浮点数

浮点表示法表示的数据,其小数点的位置是浮动的。其思想来源于十进制中的科学记数法。在科学记数法中,任何一个数都可以表示为指数形式,如762.39可以写成0.76239×103,而且可以通过改变指数,使小数点的位置发生移动,如写成76239×10-2。十进制中的科学计数法的一般形式为:N=D×10n,其中D为纯小数,n为整数。在二进制中,一个数也可以写成这种形式:P=S×2E,其中S称为尾数,E称为阶码。

①阶码:用于表示小数点在该数中的位置,它是一个带符号的整数。

②尾数:用于表示数的有效数值,可以采用整数或纯小数两种形式。

一般PC选择32位(单精度)或64位(双精度)二进制表示一个浮点数。32位浮点数格式如下:

例如,一个十进制数-34500,在机器中,它的二进制数为-1000011011000100,规格化为:-0.1000011011000100×200100000,如果使用浮点数表示,则为

5.原码、反码和补码

计算机中数的符号被数值化后,为了便于对机器数进行算术运算,提高运算速度,又设计了符号数的各种编码方案,主要有原码、反码和补码3种。

(1)原码

一个正数的原码和它的真值相同,负数的原码为这个数真值的绝对值,符号位为1。假设计算机中用8位二进制表示一个数据,最高位被设置为符号位,后面的7位表示真值。数X的原码记为[X]。0的原码有两种表示形式:

[+0]=00000000

[-0]=10000000

例如,求十进制数+67和-67的原码。

因为  (67)10=(1000011)2

所以  [+67]=01000011

[-67]=11000011

原码表示的数的范围与二进制数的位数(即机器字长)有关。如果用8位二进制数表示时,最高位为符号位,整数原码表示的范围为-128~+127,即最大数是01111111,最小数是11111111。同理,用16位二进制数表示整数原码的范围是-32768~+32767。

原码的优点是简单、直观,用原码进行乘法运算比较方便:尾数相乘,符号位单独运算(不考虑符号位产生的进位,只要将两个参加运算的数做简单的加法就得到它们乘积的符号)。显然,如果用原码进行加法运算就会遇到符号运算需要进行多次判断的麻烦:先要判断符号位是否同号,决定是进行加法或减法;对不同号的情况,还要判断哪个数的尾数大,才能决定最后运算结果的符号。为了简化原码加减法运算的复杂性,计算机中引入了反码和补码。

(2)反码

一个正数的反码等于它的原码;一个负数的反码,最高位(符号位)为1,其余各位按位求反。数X的反码记为[X]

例如,假设用8位二进制表示一个数据,则+1010010的反码为01010010,-1010010的反码为10101101。

零的反码有两种表示,即

[+0]=00000000

[-0]=11111111

一个数如果不考虑它的符号,按照取“反”的原则求它的反码,并与这个数的原数相加,其结果为所有位都是1。例如,1010010的反码为0101101,将它们相加:

1010010+0101101=1111111

这是反码的一个重要特性,也称做“互补”。通常反码作为求补码过程的中间形式。

(3)补码

一个正数的补码等于它的原码;一个负数的补码,最高位(符号位)为1,其余各位按位求反,最末位加1,即“求反加1”。数X的补码记为[X]

例如,+1010010的补码为01010010;-1010010的反码为10101101,它的补码为反码加1,即10101101+1=10101110。

零的补码表示是唯一的,即

[+0]=00000000

[-0]=00000000

补码表示的数的范围也与二进制数的位数(即机器字长)有关。如果用8位二进制数表示时,最高位为符号位,整数补码表示的范围为-128~+127。用16位二进制数表示整数补码的范围是-32768~+32767。

又如,假设用8位二进制表示一个数据,求十进制数+67和-67的补码。因为(67)10=(1000011)2所以[+67]=01000011[-67]=10111101

6.数据存储单位

(1)位

“位”(bit)是电子计算机中最小的数据单位。每一位的状态只能是0或1。

(2)字节

8个二进制位构成1个“字节”(byte,单位符号为B),它是存储空间的基本计量单位。1B可以存储1个英文字母或者半个汉字,换句话说,1个汉字占据2B的存储空间。

(3)字(word)

“字”由若干个字节构成,字的位数称做字长,不同档次的计算机有不同的字长。例如,一台8位机,它的1个字就等于1B,字长为8位。如果是一台16位机,那么,它的1个字就由2B构成,字长为16位。字是计算机进行数据处理和运算的单位,是衡量计算机性能的一个重要指标,字长越长,性能越强。

(4)KB(千字节)

在一般的计量单位中,小写k表示1000。例如,1千米=1000米,经常被写为1km;1千克=1000克,写为1kg。同样,大写K在二进制中也有类似的含义,只是这时K表示210=1024,即1KB表示1024B。

(5)MB(兆字节)

计量单位中的M(兆)是106,见到M自然想起要在该数值的后边续上6个0,即扩大100万倍。在二进制中,MB也表示百万级的数量级,但1MB不是正好等于1000000字节,而是1048576字节,即1MB=220B=1048576B。

计算机系统在数据存储容量计算中,有如下数据计量单位:

1B=8bit

1KB=210B=1024B

1MB=220B=1048576B

1GB=230B=1073741824B

1TB=240B=1099511627776B