2.2 数值数据编码
所谓数值数据,是指数据本身有大小含义,比如年龄是20岁,身高是1.75m等,这样的数据称之为数值数据。而没有大小含义的数据,像一幅图像、一个音频或者一个字符等,都没有大小含义,称之为非数值数据。这两种数据的编码方法是不同的。
前面讨论了数制,知道了一个十进制如何转换成二进制并存储在计算机中。但是表示一个十进制数时,一般不仅仅有数位,还有正号和负号,还有小数点,那么这些非数位的部分如何表示呢?
2.2.1 符号位的表示
由于符号只有正和负两种,所以,很自然地考虑到用0表示正号,1表示负号,将符号位置于数据的最左侧。这样的处理过程称之为“符号位数字化”。为了区分符号位数字化前后的数据,分别引入两个术语“真值”和“机器码”。符号位数字化之前的数据称为真值,之后的数据称为机器码。例如:
+77 D=01001101B
-77 D=11001101B
2.2.2 符号位的运算
机器码解决了用0和1表示符号的问题。但是当数值数据进行运算时,符号位怎么办呢?如果让符号位和数值位一起参加运算,很多情况下会得到错误的结果,例如:(假设处理器字长为4位)
(+4)+(-5)=-1
若用机器码运算
(0100)+(1101)=(1)0001(真值为+1)
【说明】由于字长为4位,所以最高位的1溢出了,也就是丢掉了。
显然符号位直接参与运算,结果出错了。那么怎么防止这种错误的发生呢?为了解决这个问题,又引入了3种编码:原码、反码和补码。
原码:真值经过符号位数字化后,即得原码。
对于正数而言,其原码=反码=补码。
对于负数而言,其反码与补码的计算方法如下:
反码:符号位不变,其余位取反;
补码:反码+1。
现在利用补码进行上面的运算:
(+4)补码=0100
(-5)补码=1011
(0100)+(1011)=(1111)补码=(1110)反码=(1001)原码=(-1)真值
显然采用补码后,符号位像数值位一样参加运算,运算结果也是正确的。科学家经过严谨的数学证明发现,引入补码后,可以得到两个好处:
① 符号位可以像数值位一样参加运算,结果不会出错。
② 所有的减法都可以用加法实现,简化了电路。
2.2.3 小数点的表示
数值数据中的小数点该如何表示呢?由于计算机中采用二进制,只有0和1,可是无论使用0还是使用1,都无法将小数点和数值位分开,因为小数点的位置是不固定的。为了解决小数点的表示,引入了定点数和浮点数。
1.定点数
顾名思义,定点数是指小数点固定的数。由于小数点在数值数据中的位置不固定,所以考虑让小数点固定下来,这样由于小数点的位置固定了,也就不需表示了。可是什么样的数小数点的位置固定呢?整数和纯小数。
显然,整数的小数点默认在数的最右侧,而纯小数的小数点默认在数的最左侧,如图2-7所示。
图2-7 定点小数和定点整数
2.浮点数
对于既不是整数也不是纯小数的数值如何表示呢?我们采用定点整数+定点小数的形式来表示,用这种方式表示的数,由于小数点位置不固定,故称之为“浮点数”。
一个十进制数N可以写成:
N=10e×M
同理,一个二进制数N可以写成:
N=2e×M
其中,M为一个纯小数(用定点小数表示),e为一个整数(用定点整数表示),因此,浮点数的一般表示形式,如图2-8所示。
一个浮点数一般会由4部分构成:阶符+阶码+数符+尾数。例如,浮点数(-5.25)10的表示如图2-9所示。
图2-8 浮点数的表示
图2-9 浮点数的表示