一、机器数与真值
在计算机中,只能表示0和1两种数码,所以计算机中任何信息都是采用0和1的组合序列来表示。
机器数:一个数在机器(计算机)中的表示形式称为机器数。形式上为二进制数,但有别于日常生活中使用的二进制数。
真值:机器数的实际值叫真值。真值往往是面向人的,可以用二进制数表示,也可用其它进制数表示,但根据习惯,常用十进制数表示,如图所示。
机器数和日常生活中使用的二进制数比较,有以下特点:
机器数为二进制形式,用0和1组合来表示数据。
机器数符号数码化,数的最高位为符号位。当符号位为0,表示为正数;符号位为1,表示为负数。
小数点不直接出现。机器数通过一定的方式来表示数的小数点位置,有定点表示法和浮点表示法。
机器数使用时需要明确采用的位数,相应有一定的表示范围。
二、计算机中符号数的表示方法
无符号数:表示比较简单,和其真值的二进制形式比较相近,其最高位不再是符号位,而是数值位。
符号数:采用三种编码--原码、反码和补码,分别记作:[x]原、[x]反和[x]补。
以下举例时采用数的位数为8位,但规则和方法也适用于n位机器数。
1.原码
设X=±X1,X2,…,Xn-1,其中Xi为一位二进制数,i=1,2,…,(n-1)
则
即求一个数的原码:数值部分不变,符号“+”和“-”用0和1分别来表示。
原码表示简单易懂,而且与真值的转换方便。但原码表示的数不便于计算机运算,因为在两原码数运算时,首先要判断它们的符号,然后再决定用加法还是用减法,致使机器的结构相应地复杂化或增加了机器的运算时间。
采用原码表示数时表示范围为:-(-1)~+(
-1)
8位原码表示数的范围为:-127~+127
2.反码
设X=±X1,X2,…,Xn-1,其中Xi为一位二进制数,i=1,2,…,(n-1)
则
式中
即求一个数的反码:
(1)对于正数,反码与原码相同,符号位为0,其余位为数值位本身;
(2)对于负数,反码的符号位为1,其余位为数值位按位取反。
采用反码表示数时表示范围为:-(-1)~+(
-1)
8位反码表示数的范围为:-127~+127
3.补码
补码是在同余的概念上延伸出来的。
(1) 补码的求法
设X=±X1,X2,…,Xn-1,其中Xi为一位二进制数,i=1,2,…,(n-1)
上式求数的补码应该属于是一种经验公式,对有些特殊数不适用,如-128的8位补码。严格数学公式如下:
[-128]补=+x=10000000其中n=8,x=-128
(2)由补码求真值
正数的补码和真值之间对应关系直观;而已知一个负数的补码,可通过以下方法来求得真值:
{[X]补}补=[X]原
也即把负数的补码当作原码来求补,得到的就为该负数的原码。由原码可以很方便得到真值。
例 设[X]补=10010111,求X的真值。
11101000
+ 1
11101001
[X]原=11101001,X=-1101001=-105。
下面是部分十进制数及其对应的二进制数、原码、反码和补码表示归纳如下表,其中原码、反码和补码采用八位二进制代码表示。
十进制数 | 二进制数 | 原码 | 反码 | 补码 |
+0 | +0000000 | 00000000 | 00000000 | 00000000 |
+1 | +0000001 | 00000001 | 00000001 | 00000001 |
+2 | +0000010 | 00000010 | 00000010 | 00000010 |
… | … | … | … | … |
… | … | … | … | … |
+126 | +1111110 | 01111110 | 01111110 | 01111110 |
+127 | +1111111 | 01111111 | 01111111 | 01111111 |
-0 | -0000000 | 10000000 | 11111111 | 00000000 |
-1 | -0000001 | 10000001 | 11111110 | 11111111 |
-2 | -0000010 | 10000010 | 11111101 | 11111110 |
… | … | … | … | … |
… | … | … | … | … |
-126 | -1111110 | 11111110 | 10000001 | 10000010 |
-127 | -1111111 | 11111111 | 10000000 | 10000001 |
-128 | -1000000 | 无法表示 | 无法表示 | 10000000 |
求原码、反码、补码演示:
小结:
三种编码的最高位都是表示符号位。符号位为0,表示真值为正数, 其余位都是真值;
符号位为1,表示真值为负数,其余位除原码外,不再是真值。
对正数,三种编码都是一样的,[X]原=[X]反=[X]被。对于负数,三种编码不同。
当计算机采用不同的码制时,运算器和控制器的结构将不同。采用原码形式的计算机称原码机。类似的有反码机和补码机。小型计算机和微型计算机大都为补码机。
三、补码的运算
1.补码运算的优点:
(1)符号位可以直接参加运算;
(2)求和及求差均可转化为单纯的相加运算。
2.补码运算公式
(1)[x+y]补=+(x+y) =(
+x)+(
+y) =[x]补+[y]补
(2)[x-y]补=+(x-y) =
+x+
+(-y) =[x]补+[-y]补
[-y]补的快捷求法:可通过对[y]补"连同符号位在内一起变反加1"得到,也称为求变补。
如:[y]补=00000100
则:[-y]补=11111100
3.补码运算举例:
例1: x=56,y=-97,求x+y
解: [x]补=0011,1000
[y]补=1001,1111
00111000=[x]补
+10011111=[y]补
11010111
原码为:10101001
真值为:(-0101001)2=-41
例2: x=122,y=37,求x-y。
解:[y]补=00100101
[-y]补=11011011
01111010=[x]补
+ 11011011=[-y]补
1 01010101
进位自动舍去,真值为: (01010101)2=85
例3:设x=64,y=65, 求x+y。
解: 01000000=[x]补
+01000001=[y]补
10000001
说明:
1. 此时两个正数相加,得出负数,显然是错误的。
2. 运算结果错误的原因是由于发生了溢出。溢出就是运算结果超过了数的表示范
围。如8位补码表示数范围为-128~+127,而x+y的和为129,超过范围,所以产
生"溢出"。
4.补码运算小结:
补码运算时,参加运算的两上数均为补码,结果也是补码,欲得真值,还需要经过转换。
运算时,第一,符号位与数值位可以一起参加运算;第二,符号位产生的进位可以舍掉不管;第三,要保证运算结果不超过补码所能表示的最大范围,否则将产生"溢出"错误。
为此,在计算机中设有专门电路用以判断运算结果是否产生溢出,并以某种标志告知本次运算的结果是否产生溢出。判断的规则为:运算的最高位的进位值(该位有进位值为1,无进位值为0)和次高位的进位值异或,结果为1表示有溢出,为0表示无溢出。
四、定点数与浮点数
在计算机中,不仅要处理整数运算,而且也要处理小数运算,如何处理小数点位置是十分重要的,经常用定点法或浮点法来表示小数点的位置。
1.定点表示法
定点表示法就是小数点位置在数中固定不变。小数点位置可固定在任何位置,但一般情况下,或者把小数点固定在最高数值位左边,在小数点左边设有一位符号位,小数点本身不占位,其格式为:
或者把小数点固定在最低数值位右边,其格式为:
同一二进制数约定的小数点位置不同,相应地表示的数的真值也不相同,下例说明了这个情况:
例1:在计算机中有如下一个8位二进制数N1
同样的数据,约定的小数点的位置不同数的值也不同。
例2:在计算机中有如下一个8位二进制数N2
定点数运算较为不便,所表示的数范围小、精度低。
2.浮点表示法
为了在位数有限的前题下,尽量扩大数的表示范围,同时又保持数的有效精度,计算机往往采用浮点数表示数值。
任何一个数的二进制形式均可如下表示:
式中,N称为浮点数或实数。
S是N的尾数,是数值的有效数字部分,通常用带符号的定点小数表示,一般用原
码表示。
p是指数,称为阶码,通常用带符号整数,一般用补码表示。
阶码p的大小规定了数的范围,尾数S长短则规定了数的有效数字的位数(精度)。
在计算机中,分别用一定位数的0,1表示阶码p和尾数S(均为二进制形式),p和S确定则该浮点数的值也就确定。
浮点数在机器中表示的一种形式如下:
Pf表示阶码的符号位,当Pf=0时,表示阶码正;Pf=1时,表示阶码为负。
Sf表示尾数的符号,当Sf=0时,尾数为正;Sf=1时,尾数为负。
但同一个数N以浮点数表示,P和S可以有多种形式。若浮点数中1/2≤S<1,则称该浮点数为规格化了的浮点数。一般都采用规格化浮点数。
假定尾数用8位二进制表示,阶码用4位二进制表示,均含符号位,且尾数用原码表示。则有
或表示成
同上例,阶码用补码表示,尾数用原码表示。
或表示成
当尾数和阶码分别采用一定位数表示,则浮点数表示数的范围也就确定,若
则有
由于指数可以选用不同的编码(原码、补码等),尾数的格式和小数点位置也可以有不同规定,因此,浮点数的表示方法不是唯一的。不同计算机有不同的规定,这就引起了相互间数据格式的不兼容性。为此,美国电气与电子工程师协会(IEEE)制订了有关的工业标准,已被众多计算机制造厂商采用。
五、BCD码及其十进制调整
1.BCD码(Binary Coded Decimal)采用二进制代码表示十进制数,即用四位二进代码来表示一位十进制数。它貌似二进制,实为十进制,与真正的纯二进制是不同的;
2.常用的8421BCD(简称NBCD)二进制形式和0~9数字所对应关系如下表所示。
十进制数 | NBCD | 十进制数 | NBCD |
0 1 2 3 4 5 6 7 8 | 0000 0001 0010 0011 0100 0101 0110 0111 1000 | 9 10 11 12 13 14 15 16 17 | 1001 0001 0000 0001 0001 0001 0010 0001 0011 0001 0100 0001 0101 0001 0110 0001 0111 |
3.BCD码数运算后当有以下情况时需要对运算结果进行加6(0110)调整:
若两个BCD数相加结果的相应四位大于9(1001)时,则应作修正。
若两个BCD数相加结果在本位上并不大于9(1001),但却产生了进位,也应作修正。
需要调整的原因:由于BCD码只是将每位十进制数用4位二进制数来表示,而每组4位二进制之间应该是逢十进一,但由于计算机总是将数作为二进制数来处理的,因此实际上这组
4位数和其它4位数是按逢十六进一处理的,大于9时没有进位。计算机中有专用调整指令(如DAA,DAS),能按照规则自动进行调正。
4.BCD码在计算机中有二种表示方法:一种是一个字节表示两位十进制数,称为压缩BCD码;一种是一个字节仅表示一位十进制数,称为非压缩BCD码。