6.1 无符号数和有符号数
一、无符号数
寄存器的位数,反映无符号数的表示范围:
8位:0~255;16位:0~65535
二、有符号数
1.机器数与真值
计算机没有硬件来表示小数点,小数点的位置只能通过约定的方式确定。
真值(带符号的数) | 机器数(符号数字化的数) | ||
+0.1011 | 0 | 小数点 | 1011 |
-0.1011 | 1 | 小数点 | 1011 |
+1100 | 0 | 1100 | 小数点 |
-1100 | 1 | 1100 | 小数点 |
2.原码表示法
(1)定义:
整数:[x]原=0,x(当0<=x<2n)2n -x(-2n <x<=0)
小数:[x]原=x(当0<=x<1)1-x(-1 <x<=0)
例:求x=0的原码:
设x=+0.0000,则[+0.0000]原=0.0000;设x=-0.0000,则[-0.0000]原=1.0000
同理,对于整数[+0]原=0,0000,[-0]原=1,0000
故[+0]原≠[-0]原
3.原码的特点:简单、直观
但是用原码作加法,会出现如下问题:
要求 | 数1 | 数2 | 实际操作 | 结果符号 |
加法 | + | + | 加 | + |
加法 | + | – | 减 | -/+ |
加法 | – | + | 减 | -/+ |
加法 | – | – | 加 | 负 |
能否只作加法?找到一个与负数等价的整数来代替这个负数!
3.补码表示法
结论:
(1)一个负数加上“模”即得该负数的补数;
(2)一个整数和一个负数互为补数时,它们绝对值之和即为模数;
(3)正数的补数即为其本身;
(4)负数的补码=负数的反码+1。
但是补码的定义如下:
[x]补=2n+1+x(负整数),2+x(-1<=x<0(mod 2))
4.反码表示法
不再累述
5.三种机器数的小结
(1)最高位为符号位,书写上用“,”(整数)或“.”(小数)将数值部分和符号位隔开;
(2)对于正数,原码=补码=反码;
(3)对于负数,符号位为1,其数值部分原码除符号位外每位取反末位加1得补码,原码除符号位外每位取反得反码。
6.移码表示
补码很难直接判断其真值大小。
(1)移码的定义:
[x]移=2n+x
只有整数形式,没有小数形式。
(2)移码和补码的比较:
补码与移码只差一个符号位。
(3)真值、补码和移码的对照表
如图1.1所示。
图1.1 真值、补码和移码的对照表
(4)移码的特点
①若x=0,则[+0]移=25+0=1,00000(最高位为符号位),[-0]移=25-0=1,00000。所以[+0]移=[-0]移。
②当n=5时,最小的真值为-25=-100000,[-100000]移=25-100000=000000。
可见,最小真值的移码为全0。
用移码表示浮点数的阶码,能方便地判断浮点数阶码的大小。
6.2 数的定点表示和浮点表示
一、定点表示
是指小数点按照约定方式给出。无论是软件还是硬件开发人员,都必须遵循按照约定方式。
有以下两种形式:
1.
数符 | 小数点 | 数值部分 |
这说明表示的全为小数,若为补码,则能表示的唯一整数是-1。
数符 | 数值部分 | 小数点 |
这说明表示的全为整数。
由此我们可以把定点机分为两类,一类是小数定点机(形式1)和整数定点机(形式2)。
下面来说一下他们用原码、反码和补码表示的时候的范围。
表2.1 定点机的表示范围
小数定点机 | 整数定点机 | |
原码 | -(1-2-n)~(1-2-n)有2n+1个 | -(2n-1)~ (2n-1) |
补码 | -1~(1-2-n) | -(2n)~(2n-1) |
反码 | -(1-2-n)~(1-2-n) | -(2n-1)~ (2n-1) |
二、浮点表示(重点)
0.为什么要在计算机引入浮点数表示?
①编程困难,程序员要调节小数点的位置;
②数的表示范围小,为了能表示两个大小相差很大的数据,需要很长的机器字长;
③数据存储单元的利用率往往很低。
如图2.1所示。
图2.1 浮点表示
注意:尾数是小数、可正可负,阶码是整数、可正可负。当r=2尾数中的每一位二进制数就表示了尾数的一位;当r=4,尾数当中的2位二进制数表示了1位四进制尾数。如图中所示,原来数是11.0101,当我们固定小数点,将数字右移两位的时候,表示数字变为了原来的四分之一,所以阶码为10(10是十进制的2,22=4);当我们只右移1位时,表示数字变为了原来的二分之一,所以阶码为1(1是十进制的1,21=2);同样,当左移2位的时候,数字变为了原来的四倍,所以阶码为-10,(10是十进制的2,2-2=1/4),剩余一个同理。在计算机中,只有打对号的两个数才能存储,其中第一种小数点后面第1位为1,称为规格化数。
1.浮点数的表示形式
图2.2 浮点数的表示形式
Sf表示浮点数的符号;n表示了浮点数的精度,m表示浮点数的表示范围,jf和m(实际是阶符和阶码)共同标识小数点的书记位置。
2.浮点数的表示范围
图2.3 浮点数的表示范围
上溢:阶码>最大阶码。下溢:阶码<最小阶码,按机器零处理。阶码都用原码来表示。
最小负数和最大正数的绝对值其实是一样的。最大正数的尾数最大为全1,阶码也为全1。这样的情况下,尾数为(1-2n),阶码为2m-1,故如图2.3所示。最大负数,最小正数同理。
实际上我们是由有限的个数表示无限多的实数。
练习:机器数字长为24位,欲表示±3万的十进制数,试问在保证数的最大精度的前提下,除阶符、数符各取1位外,阶码、尾数各取几位?
因为2的14次方=16384,2的15次方是32768,满足要求。阶码应该在±15。所以定点数15位二进制数可以反映±3万之间的十进制数。因为要保证数的最大精度,所以尾数尽可能的长,所以阶码位数尽可能短,所以阶码是4位。24-4-1(阶符)-1(数符)=18,为尾数的长度。
3.浮点数的规格化形式
为了保证尽可能保证浮点数的精度,所以要对浮点数进行规格化。
若r=2,尾数最高位为1;
若r=4,尾数最高2位不全为0;
若r=8,尾数最高3位不全为0。
基数不同,浮点数的规格化形式不同。
4.浮点数的规格化
表2.1 浮点数的规格化形式
基值 | 规格化形式 | 规格化方式 |
r=2 | 左规 | 尾数左移1位,阶码减1 |
右规 | 尾数右移1位,阶码加1 | |
r=4 | 左规 | 尾数左移2位,阶码减1 |
右规 | 尾数右移2位,阶码加2 | |
r=8 | 左规 | 尾数左移3位,阶码减1 |
右规 | 尾数右移3位,阶码加3 |
基数r越大,可表示的浮点数范围越大,基数r越大,浮点数的精度越大。
例如:设m=4,n=10,r=2。尾数规格化的浮点数表示范围:
最大正数:2+1111*0.1111111111=215*(1-2-10);
最小正数:2-1111*0.1000000000=2-15*2-1=216;
最小负数:-215*(1-2-10);
最大负数:-2-15*2-1=-216。
三、举例
例6.13:将写成二进制定点数、浮点数及在定点机和浮点机中的机器数形式。其中树枝部分均取10位,数符取1位,浮点数阶码取5位(含1位阶符),尾数规格化。
解:设x=,则二进制形式为0.0010011,定点表示为0.0010011000,因为要求10位,所以补3个零。
浮点规格化表示,因为规格化,所以小数点后第一位必须是1,所以表示为。
定点机中,原码=补码=反码=0.0010011000
浮点机中,[x]原=1, 0010;0.1001100000(第一位的1是阶码,0010是阶符,0.1001100000是尾数)
[x]补=1,1110;0.1001100000
[x]反=1,1101;0.1001100000
例6.14:将 –58 表示成二进制定点数和浮点数,并写出它在定点机和浮点机中的三种机器数及阶码 为移码、尾数为补码的形式(其他要求同上例)。
解:设x=-58,则写为二进制表示为x=-111010,定点表示为-0000111010,浮点规格化形势为-(0.1110100000*2110)。定点机中,[x]原=1,0000111010,[x]反=1,1111000101,[x]反=1,1111000110。
浮点机中[x]原=0,0110;1.11101000000;[x]补 = 0, 0110; 1. 0001100000;
[x]反 = 0, 0110; 1. 0001011111 [x]阶移、尾补 = 1, 0110; 1. 0001100000
机器零
浮点数尾数为0时,不论其阶码为何值按机器零处理。
当浮点数阶码等于或小于它表示的最小数时,不论尾数为何值,按机器零处理。
总的来说,是以下两种情况:
(1)x,xxxx;0.0000…000
(2)(阶码-16)1,0000;x.xx…xxx
当阶码用移码,尾数用补码表示时,机器零为0,0000;0.00…0
这非常有利于机器中“判0”电路的实现。
四、IEEE 754标准
格式如图2.4所示。
图2.4 IEEE 754标准浮点数示意图
由于尾数为规格化表示,那么最高位一定是1,所以可以把这1位省略掉,这样可以提高精度。如表2.2所示
表2.2 IEEE 754数的类型
类型 | 符号位S | 阶码 | 尾数 | 总位数 | 表示范围 |
短实数 | 1 | 8 | 23 | 32 | |
长实数 | 1 | 11 | 52 | 64 | |
临时实数 | 1 | 15 | 64 | 80 |