概念
整个机器字长的全部二进制位均为数值位,没有符号位,相当于数的绝对值
无符号数的表示范围
假设我们的计算机是8位的,那么其实我们就可以表示8bit位以内的数据其实也就是:
0000 0000-1111 1111
0-255
如果我们不采用无符号数,那么其实我们能够表示的数据范围就会发生改变其实能够真正表示数据的是不是只有7位了,还有一位我们需要作为符号位。
约定: 用X表示真值,用【X]原表示原码,[X]补表示补码,[X]反表示反码,[X]移表示移码
约定: 用X表示真值,用[X]原表示原码,[X]补表示补码,[X]反表示反码,[X]移表示移码
用尾数 (也就是数值部分) 表示真值的绝对值
若机器字长为n+1位,则尾数为n位
原码整数表示范围:
− ( 2 n − 1 ) ≤ x ≤ ( 2 n − 1 ) -(2^n-1)≤x≤(2^n-1) −(2n−1)≤x≤(2n−1)
定点整数的特点
所以0的原码整数在计算机内部有两种表示形式,+0和-0
但是n+1位应该对应有2n+1种状态,真值0其实占用了两种状态,合理
有符号数的定点表示 (反码)
反码特征:
列子
若机器字长为n+1位,则尾数为n位我们假设机器字长为8位。
+9
[X]原=0,0001001 [X]反=0,0001001
-9
[X]原=1,0001001 [X]度=1,1110110
+0.75
[X]原=0.1100000 [X]反=0.1100000
-0.75
[X]原=1.1100000 [X]度=1.0011111
反码的用途
(1) 其中一个用途就是“原码”转换成“补码”的一个中间状态
(2) 还可以应用于系统环境设置,如linux平台的目录和文件的默认权限的设置,就是使用反码原理
有符号数的定点表示 (补码)
补码特征:
例子
若机器字长为n+1位,则尾数为n位
我们假设机器字长为8位
+9
[X]原=0,0001001 [X]补=0,0001001
-9
[X]原=1,0001001 [X]反=1,1110110 [X]补=1,1110111
+0.75
[X]原=0.1100000 [X]补=0.1100000
-0.75
[X]原=1.1100000 [X]反=1.0011111 [X]补=1.0100000
有符号数的定点表示(移码) (只有整数)
方法1: 在补码的基础上将符号位取反
方法2: 在真值的基础上加上 2 n 2^n 2n
移码的特征
例子
若机器字长为n+1位,则尾数为n位 我们假设机器字长为8位。
+9
[X]原=0,0001001 [X]补=0,0001001 [X]移=1,0001001
-9
[X]原=1,0001001 [X]补=1,1110111 [X]移=0,1110111
[概念] 移位运算
算术移位、逻辑移位、循环移位
原码算术右移:高位补0,低位移除
原码算术左移: 符号位不动,数值位低位补0,高位移除
(1) 正数反码算术移位: (和原码完全相同)
(2)负数反码算术移位
(1) 正数补码算术移位: (和原码完全相同)
(2) 负数补码算术移位
无论什么数:
概念
(1)加法器直接对原码进行计算可能会出错
(2) 加法规则:
(3)减法规则:
两个原码表示的数相减,首先将减数符号取反,然后将被减数与符号取反后的减数按原码加法进行运算
(4)运算时注意机器字长,当左边出现溢出时,将溢出位丢掉
原码的加法运算
原码的减法运算
原码的减法运算,"减数"符号取反,转变为加法
使用补码进行加法运算,当结果不超过机器的表示范围时,有以下结论:
例子
(1)X=+13,Y= -14,则[]补=01101,[Y]补=10010
[X+Y]补=01101+10010=11111,因此X+Y=-1
(2)X=+0.1001,Y=-0.0011,则[X]补=0.1001,[Y]补=1.1101
[X+Y]补=0.1001+1.1101=0.0110,因此X+Y=0.0110
(3)X=+11,Y= +4,则[X]补=01011,[Y]补=00100 ,[-Y]补=11100
[X-Y]补= [X]补+[-Y]补=01011+11100=00111,
因此X-Y=7
(1)X=+13,Y=+4,则[X]补=01101,[Y]补=00100
[X+Y]补=01101+00100=10001
从符号位来看是一个负数,显然错误。
(2)X=+0.1001,Y=+0.1001,则[X]补=0.1001,[Y]补=0.1001
X+Y补=0.1001+0.1001=1.0010
从符号位来看是一个负数,显然错误
上述现象称为溢出,即两个定点数经过加减法运算后,结果超出了机器所能表示的范围,此时的结果无效。
因此.在定点加减运算过程中,必须对结果是否溢出进判断。
正+正 一结果为负,称为正溢;
负+负 结果为正,称为负溢。
注意:
正-负->正+正
负-正->负+负
常用的判别溢出方法有以下3种。
1)符号比较法
2)双进位法
3)双符号位法
由于减法运算在机器中是用加法器实现的,因此无论是加法还是减法,只要参加操作的两个数符号相同,结果又与原操作数符号不同,则表示结果溢出
概念
定点数: 就是小数点位置不变的数
浮点数: 浮点数是指小数点位置可以浮动的数据,通常表示如下
浮点数表示范围
设浮点数阶码的数值位取n位,尾数的数值位取m位,两者均用补码表示,M.表示尾数的符号位,当浮点数为非规格化数时,它在数轴上的表示范围如下图所示(注意:“上溢”、“下溢”(机器零) )。
[概念] 浮点数的规格化:
规定浮点数的尾数部分必须为纯小数,且当尾数的值不为0时,其绝对值应大于等于十进制数的0.5,称为浮点数的规化表示 (0.1***和1.0***的形式)
当浮点数的尾数不满足要求时,需要左移或右移尾数,同时对阶码进行修改,使之符合规格化的要求,这一过程称为规格化操作。
在规格化过程中,尾数每向左算术移位1次阶码减1.称为向左规格化.简称左规:尾数每向右移一位,则阶码加1,称为向右规格化,简称右规
什么情况下进行尾数的规格化?
左规: 当浮点数运算的结果为非规格化时要进行规格化处理,将尾数算数左移一位,阶码减1
右规: 当浮点数运算的结果尾数出现溢出 (双符号位为01或10),将尾数算数右移一位,阶码加1
现代计算机中,浮点数一般采用IEEE754国际标准。标准中规定常用的浮点数有单精度和双精度两种形式
格式如下:
符号位 | 阶码 | 尾数 | 总位数 | |
---|---|---|---|---|
单精度 | 1 | 8 | 23 | 32 |
双精度 | 1 | 11 | 52 | 64 |
阶码用移码表示,真值都被加上一个偏移量,单精度采用的是移127的移码方案,双精度采用的是移1023的
移码方案。(为什么是127? )
在移127的移码方案中,8位移码结果不再与8位补码存在仅符号位相反的对应关系,其值要通过对阶码实际
值加127得到,或将标准移码的值再减1得到。
尾数采用原码表示,对规格化的非0值尾数使用隐藏位技术,即非零值的规格化浮点数的尾数最高位始终为
1,这一位不予存储,而认为隐含在小数点的左边,这是通过左移原来的尾数实现的,故可以使结果的表示
精度多一个二进制位,此时它所表示的实际值在1-2之间,若尾数是 M,则此时所表示的值是1.M(天然的规
格化)。
最小绝对值:尾数全为0,阶码真值最小-126,对应移码机器数0000 0001 此时整体的真值为(1.0) 2-126
最大绝对值:尾数全为1,阶码真值最大 127,对应移码机器数1111110
此时整体的真值为(1.111…11)X2127
只有1≤E≤254时,(-126-127) 真值= ( − 1 ) s ∗ 1. M ∗ 2 E − 127 (-1)^s*1.M*2^{E-127} (−1)s∗1.M∗2E−127
当阶码E全为0,(-127)尾数M不全为0时,表示非规格化小数 ( 0. x . . x ) x 2 − 126 (0.x..x)x2^{-126} (0.x..x)x2−126
当阶码E全为0,(-127)尾数M全为0时,表示真值 0
当阶码E全为1,(-128)尾数M全为0时,表示无穷大
当阶码E全为1,(-128)尾数M不全为0时,表示非数值"NaN”(Not a Number)
浮点数的加减运算一般分为如下5个操作步骤
例子
1.50408 ∗ 1 0 6 + 4.08150 ∗ 1 0 4 1.50408*10^6+4.08150*10^4 1.50408∗106+4.08150∗104
对阶 1.50408 ∗ 1 0 6 + 0.0408150 ∗ 1 0 6 1.50408*10^6+0.0408150*10^6 1.50408∗106+0.0408150∗106
尾数求和 1.50408 + 0.0408150 = 1.5448950 1.50408+0.0408150=1.5448950 1.50408+0.0408150=1.5448950
规格化 15.448950(右规) 0.015448950(左规)
舍入
若规定只能有5位尾数,那么
判断溢出
规定阶码不能超过10,那么如果出现 1.5448950 ∗ 1 0 10 1.5448950*10^{10} 1.5448950∗1010就表示溢出
(真正的溢出:在尾数为规格化数的时候,阶码确实大于最大值)
(虚假的溢出: 尾数出现溢出,可以采用规格化进行调整)
例子
设X= 2 6 x 0.1010000 2^6 x0.1010000 26x0.1010000,Y= 2 7 x 0.1101000 2^7 x0.1101000 27x0.1101000,求X+Y
解 设阶码、尾数均采用补码表示形式,双符号位。阶码数值位4位,尾数数值位7位:
阶符 | 阶码 | 尾符 | 尾数 | |
---|---|---|---|---|
x | 00 | 0110 | 00 | 1010000 |
Y | 00 | 0111 | 00 | 1101000 |
(1)求阶差.对大阶。
阶差 △ E = [ E X ] 补 + [ − E Y ] 补 = 000110 + 111001 = 111111 \triangle E=[EX]_补+[-EY]_补=000110+111001=111111 △E=[EX]补+[−EY]补=000110+111001=111111
X 阶码小,MX 算术右移1位,保留阶码 [ E ] 补 = [ E Y ] 补 = 000111 [E]_补=[EY]_补=000111 [E]补=[EY]补=000111。
[ M x ] 补 = 00.01010000 [Mx]_补=00.01010000 [Mx]补=00.01010000。
(2)尾数相加。
[ M ] 补 = [ M X ] 补 + [ M Y ] 补 = 01.00100000 [M]_补=[MX]_补+[MY]_补=01.00100000 [M]补=[MX]补+[MY]补=01.00100000。
(3)规格化操作。双符号位不一致,因此右规,尾数右移一位,阶码加1
[ M ] 补 = 00.100100000 [M]_补=00.1001000 00 [M]补=00.100100000
[ E ] 补 = 000111 + 000001 = 001000 [E]_补=000111+000001=001000 [E]补=000111+000001=001000。
(4)舍入。附加位的最高位为0,舍去, [ M ] 补 = 00.1001000 [M]_补=00.1001000 [M]补=00.1001000
(5)判溢出。阶码的双符号位相同.故不溢出。
在浮点数加减运算的最后需要对阶码是否溢出进行判断,若未溢出,运算正常结束,若阶码下溢(比能表示的最小数还小时),则将结果置为机器零若阶码上溢,则置溢出标志。