文章目录
- 数据的表示与运算
- 数据表示
- 定点数的表示与运算
- 定点数的表示
- 无符号数
- 有符号数
- 定点整数
- 定点小数
- 四码
- 反码
- 补码
- 移码
- 总结
- 定点数的运算
- 算术移位
- 原码
- 反码
- 补码
- 总结
- 逻辑位移
- 循环位移
- 总结
- 加减运算
- 原码加减法
- 补码加减法
- 溢出判断
- 采用一位符号位
- 浮点数的表示与运算
- 表示
- IEEE 754
- 浮点数加减法
数据的表示与运算
数据表示
常见二进制数据
真值和机器数
定点数的表示与运算
概念
- 点: 其实就是小数点
- 定点数: 小数点的位置固定
- 浮点数: 小数点的位置不固定
- 类似于我们生活中使用的常数
- 二进制浮点数: 类似于科学计数法
例子
定点数: 150.408
浮点数: 1.50408*102
定点数的表示
无符号数
整个机器字长的全部二进制位均为数值位,没有符号位,相当于数的绝对值
无符号数的表示范围
假设我们的计算机是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.0000000
- 零:1.0000000
所以0的原码整数在计算机内部有两种表示形式,+0和-0
- 正数:有2n-1个
- 负数:有2n-1个
- 零:有一个
- 总共:2N+1-1个
但是n+1位应该对应有2n+1种状态,真值0其实占用了两种状态,合理
定点小数
- 若机器字长为n+1位,则尾数为n位
原码小数表示范围
− ( 1 − 2 − n ) ≤ x ≤ ( 1 − 2 − n ) -(1-2^{-n})≤x≤(1-2^{-n}) −(1−2−n)≤x≤(1−2−n) - 同样,在这里真值0其实也占用了两种状态也就是有 + 0和-0两种形式
- 其实原码的定点整数和定点小数的分布是关于原点对称的
四码
反码
有符号数的定点表示 (反码)
- 正数: 反码和原码相同
- 负数: 数值位全部取反
反码特征:
- 反码整数的表示范围
− ( 2 n − 1 ) ≤ x ≤ ( 2 n − 1 ) -(2^n-1)≤x≤(2^n-1) −(2n−1)≤x≤(2n−1) - 反码小数的表示范围
− ( 1 − 2 − n ) ≤ x ≤ ( 1 − 2 − n ) -(1-2^{-n})≤x≤(1-2^{-n}) −(1−2−n)≤x≤(1−2−n) - 同样,在这里无论是小数还是整数,真值0其实也占用了两种状态也就是有 +0和-0两种形式。
- +零 0.0000000 -零 1,1111111
所以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平台的目录和文件的默认权限的设置,就是使用反码原理
补码
有符号数的定点表示 (补码)
- 正数: 补码和原码相同
- 负数: 原码数值位全部取反(得到反码),未位+1
补码特征:
- [+0]原=0,0000000 [-0]原=1,0000000
[+0]反=0,0000000 [-0]反=1,1111111
[+0]补=0,0000000 [-0]补=0,0000000 - 这里不一样的是,真值0的补码只有一种表示形式,多出来了一个1,0000000
- 补码整数的表示范围
− 2 n − ≤ x ≤ ( 2 n − 1 ) -2^n-≤x≤(2^n-1) −2n−≤x≤(2n−1) - 补码小数的表示范围
− 1 ≤ x ≤ ( 1 − 2 − n ) -1≤x≤(1-2^{-n}) −1≤x≤(1−2−n) - 规定,补码整数 1 , 0000000 = − 2 7 1,0000000=-2^7 1,0000000=−27 规定,补码小数1.0000000=-1
例子
若机器字长为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
移码的特征
- [+0]补=0,0000000 [+0]移=1,0000000
[-0]补=0,0000000 [-0]移=1,0000000 - 所以真值0的移码也只有一种表示形式,1,0000000其实就表示0
- 移码的表示范围
− 2 n ≤ x ≤ ( 2 n − 1 ) -2^n≤x≤(2^n-1) −2n≤x≤(2n−1)
例子
若机器字长为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,相当于除2,;
- 若丢弃位不等0,会丢失精度;
原码算术左移: 符号位不动,数值位低位补0,高位移除
- 若丢弃位=0,相当于*2;
- 若丢弃位不等于0,会出现严重误差
反码
(1) 正数反码算术移位: (和原码完全相同)
- 符号位不动,对数值位操作。
- 右移:高位补0,低位舍弃;
- 左移: 低位补0,高位舍弃;
- 注意精度和误差
(2)负数反码算术移位
- 符号位不动,对数值位操作。
- 右移:高位补1,低位舍弃;
- 左移: 低位补1,高位舍弃;
- 注意精度和误差
补码
(1) 正数补码算术移位: (和原码完全相同)
- 符号位不动,对数值位操作。
- 右移:高位补0,低位舍弃
- 左移: 低位补0,高位舍弃;
- 注意精度和误差
(2) 负数补码算术移位
- 符号位不动,对数值位操作
- 右移(同反码): 高位补1,低位舍弃;
- 左移(同原码): 低位补0,高位舍弃:
- 注意精度和误差
总结
逻辑位移
无论什么数:
- 右移:高位补0,低位舍弃;
- 左移: 低位补0,高位舍弃
循环位移
总结
加减运算
原码加减法
概念
(1)加法器直接对原码进行计算可能会出错
(2) 加法规则:
- 先判断符号位,
- 若相同,则绝对值相加,结果符号位不变;若不同,则做减法,绝对值大的数减去绝对值小的数,结果的符号与绝对值大的数相同
(3)减法规则:
两个原码表示的数相减,首先将减数符号取反,然后将被减数与符号取反后的减数按原码加法进行运算
(4)运算时注意机器字长,当左边出现溢出时,将溢出位丢掉
原码的加法运算
- 正+正一绝对值做加法,结果为正
- 负+负 一绝对值做加法,结果为负
- 正+负 一绝对值大的减绝对值小的,符号同绝对值大的数
- 负+正一绝对值大的减绝对值小的,符号同绝对值大的数
原码的减法运算
原码的减法运算,"减数"符号取反,转变为加法
- 正-负一正+正
- 负-正一负+负
- 正-正一正+负
- 负-负一负+正
补码加减法
使用补码进行加法运算,当结果不超过机器的表示范围时,有以下结论:
- 用补码表示的两数进行加法运算,其结果仍为补码;
- [X+Y]补=[X]补土[Y]补(mod2);
- 符号位与数值位一样参与运算
- 符号位与数值位按同样规则一起参与运算,符号位运算产生的进位要丢掉,结果的符号位由运算得
例子
(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(Mantissa)为尾数(纯小数)
- E(Exponent)为阶码(整数)
- R(Radix)称为阶的基数(底),而且R为一常数(与尾数的基数相同)
- R: 一般为2、8或16。在一台计算机中,所有数据的R 都是相同的,因此不需要在每个数据中表
示出来。 - 阶码: 常用补码或移码表示的定点整数
- 尾数: 常用原码或补码表示的定点小数
- RE: 就是让小数点移动
浮点数表示范围
设浮点数阶码的数值位取n位,尾数的数值位取m位,两者均用补码表示,M.表示尾数的符号位,当浮点数为非规格化数时,它在数轴上的表示范围如下图所示(注意:“上溢”、“下溢”(机器零) )。
[概念] 浮点数的规格化:
规定浮点数的尾数部分必须为纯小数,且当尾数的值不为0时,其绝对值应大于等于十进制数的0.5,称为浮点数的规化表示 (0.1***和1.0***的形式)
当浮点数的尾数不满足要求时,需要左移或右移尾数,同时对阶码进行修改,使之符合规格化的要求,这一过程称为规格化操作。
在规格化过程中,尾数每向左算术移位1次阶码减1.称为向左规格化.简称左规:尾数每向右移一位,则阶码加1,称为向右规格化,简称右规
什么情况下进行尾数的规格化?
左规: 当浮点数运算的结果为非规格化时要进行规格化处理,将尾数算数左移一位,阶码减1
右规: 当浮点数运算的结果尾数出现溢出 (双符号位为01或10),将尾数算数右移一位,阶码加1
IEEE 754
现代计算机中,浮点数一般采用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位尾数,那么- 1.54489501.54489(直接舍弃低位)
- 1.54489501.54490(舍弃部分大于0,低位 +1)
- 1.54489501.54490(四舍五入)
-
判断溢出
规定阶码不能超过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)判溢出。阶码的双符号位相同.故不溢出。
在浮点数加减运算的最后需要对阶码是否溢出进行判断,若未溢出,运算正常结束,若阶码下溢(比能表示的最小数还小时),则将结果置为机器零若阶码上溢,则置溢出标志。