定点数表示与运算
定点数的表示
无符号数与有符号数的表示
1.无符号数
指整个机器字长的全部二进制位均为数值位,没有符号位,相当于数的绝对值。
如:机器字长为n位,则数的表示范围为0~2n-1。
2.有符号数
0表示正,1表示负。通常约定二进制数的最高位为符号位。
有符号数的机器表示有原码、补码、反码、移码。
机器数的定点表示
1.定点小数
定点小数是纯小数,约定小数点位置在符号位之后、有效数值部分最高位之前。如:X=x₀.x₁x₂x₃x₄x₅…(x₀为符号位,x₁x₂x₃x₄x₅…为数值的有效部分,也称尾数,x₁为最高有效位,实际并无小数点,只为好看)
表示范围:(机器字长为n+1位时)
当x₀=0时,0.1111111…,为X所能表示的最大正数,真值=1-2-n
当x₀=1时,1.1111111…,为X所能表示的最小负数,真值=-(1-2-n)
2.定点整数
定点整数是纯整数,约定小数点位置在有效数值部分最低位之后。
如:X=x₀x₁x₂x₃x₄x₅…
表示范围:(机器字长为n+1位时)
当x₀=0时,01111111…,为X所能表示的最大正数,真值=2n-1
当x₀=1时,11111111…,为X所能表示的最小负数,真值=-(2n-1)
原码、补码、反码、移码
一、原码表示法
原码用机器数的最高位表示符号,其余各位表示数的绝对值
1.纯小数源码定义
{ x 0≤x<1
[X]原={
{ 1+|x| -1<x≤0
表示范围(机器字长为n+1位时)
若字长为n+1,则原码小数的表示范围为-(1-2n)≤x≤(1-2n)
关于原点对称
2.纯整数原码定义
{ 0,x 0≤x<2^n
[X]原={
{ 2^n+|x| -2^n<x≤0
表示范围(机器字长为n+1位时)
若字长为n+1,则原码整数的表示范围为-(2n-1)≤x≤(2n-1)
关于原点对称
真值0的原码表示有正零和负零两种形式,[+0]=00000 [-0]=10000
二、补码表示法
原码表示法进行加减法操作比较复杂,如两个不同符号的加法:需要比较两个数绝对值的大小,然后用大的减去小的,最后再需要给结果选择正确的符号,这太麻烦了,我们需要一种更简单的方法。所以有了补码表示,对加减法操作,可以统一使用加法。
1.纯小数补码定义
{ x 0≤x<1
[X]补={ (mod 2)
{ 2+x=2-|x| -1≤x<0
表示范围(机器字长为n+1位时)
若字长为n+1,则原码整数的表示范围为-1≤x≤(1-2-n)
(比原码多表示-1)
2.纯整数补码定义
{ 0,x 0≤x<2^n
[X]补={
{ 2^(n+1)+x=2^(n+1)-|x| -2^n≤x≤0
表示范围(机器字长为n+1位时)
若字长为n+1,则原码整数的表示范围为-2n≤x≤(2n-1)
比原码多表示-2n
真值0的表示唯一:0.0000
原码——>补码
正数:补码=原码
负数:原码取反+1
补码——>原码
正数:补码=原码
负数:补码取反+1
三、反码表示法
反码通常用作由原码求补码或补码求原码的中间过渡
1.纯小数的反码定义
{ x 0≤x<1
[X]反={
{ [2-2^(-n)]+x -1<x≤0
表示范围同原码
真值0的反码表示不唯一,-0符号位为1,数值位取反;[+0]=0.0000 [-0]=1.1111
2.纯整数的反码定义
{ 0,x 0≤x<2^n
[X]反={
{ [2^(n+1)-1]+x -2^n≤x≤0
表示范围同原码
小结:原码——>反码
正数:原码=反码
负数:符号位不变,原码数值位取反=反码
四、移码表示法
移码常用来表示浮点是的阶码,它只能表示整数。
移码就是在真值X上加上一个常数(偏置值),通常这个常数取2n.
[X]移=2n+x
(-2n≤x<2n,机器字长为n+1)
移码中0表示唯一:2n+0
1.真值的移码和补码仅差一个符号位,补码的符号位取反即得移码,反之亦然。
2.移码全0时,对应真值最小值-2n,全1时,对应真值最大值2n-1.
3.移码保持了数据的原有大小顺序,移码大则数据大。
定点数的运算
定点数的移位运算
一、算数移位
有符号数的移位称为算数移位,在移位过程中符号保持不变
移位添补规则:
码制 添补代码
正数 原码、补码、反码 0
--------------------------------------------------------------------
原码 0
负数 补码 {左移添0
{右移添1
反码 1
其实全部添0,只是反码取反后为1,所以添1;补码因为末位+1,所以本来因为取反添1,然后+1,变成了添0;而右移则因为取反,所以添1.
二、逻辑移位
逻辑移位将操作时视为无符号数,无论左移还是右移都添0.
三、循环移位
循环移位分为带进位标志位CF的循环移位(大循环)和不带进位标志位的循环移位(小循环)。
如:
不带进位标志位的循环右移:
CF---x₁x₂x₃x₄ x₅——>CF:x₅-----x₅ x₁x₂x₃x₄
不带进位标志位的循环移位会将移出的字节,存入进位标志位
带进位标志位的循环移位,进位标志位的字节会一同循环移动
原码定点数的加减法运算
符号位不参与运算,而是另外判断
加法规则 : 先判断符号位,若相同,则绝对值相加,结果符号位不变;若不同,则做减法,绝对值大的减去绝对值小的,结果符号位与绝对值大的数相同。
减法规则:两个原码表示的数相减,首先将符号位取反,然后将被减数与符号取反后的减数按原码加法进行计算。
补码定点数加减法运算
符号位与数值位一同参与运算,符号位产生的进位丢掉。
加法规则:[A+B]补=[A]补+[B]补
减法规则:[A-B]补=[A]补+[-B]补
**例:**设机器字长为8位(含一位符号位),A=15,B=24,求[A+B]补和[A-B]补
解:
A=+15=+0001111,B=+24=+0011000,得[A]补=00001111,[B]补=00011000.
[-B]补=11101000
所以[A+B]补=[A]补+[B]补=00001111+00011000=00100111.对应真值=+39
[A-B]补=[A]补+[-B]补=00001111+11101000=11110111,最高位为符号位1,
表示为负。对应真值=-9.
溢出判断
溢出是指运算结果超过了数的表示范围。通常称大于机器所能表示的最大正数为上溢,小于机器所能表示的最小负数为下溢。
如定点小数表示范围:|x|<1:
下溢 | 负数区 正数区 | 上溢
---------+---------------------+-------------------+------>
-1 0 1
仅当两个符号相同的数相加或两个符号数相异的数相减才可能产生溢出
补码定点数加减运算溢出判断有三种方法:
一、采用一位符号位
无论加法还是减法,只要参加操作的两个运算数符号相同,结果又与原操作数符号不同,则表示结果溢出。
设A的符号为As,B的符号为Bs,运算结果符号为Ss,则溢出逻辑表达式为:
V=AsBs(Ss)非+(AsBs)非Ss
V=0表示无溢出,V=1表示有溢出。
采用双符号位
双符号位也称模4补码,运算结果的两个符号位Ss₁Ss₂相同,表示未溢出
不同表示溢出,此时最高位符号位代表真正的符号
①Ss₁Ss₂=00;表示结果为正,无溢出
②Ss₁Ss₂=01;表示结果正溢出
③Ss₁Ss₂=10;表示结果负溢出
④Ss₁Ss₂=11;表示结果为负数,无溢出
溢出逻辑判断表达式:V=Ss₁⊕Ss₂
V=0表示无溢出。
采用一位符号位根据数据位的进位情况判断溢出
符号位的仅为Cs与最高数位的进位C₁相同,则说明没有溢出,否则表示发生溢出。
溢出逻辑判断表达式为:V=Cs⊕C₁,V=0表示无溢出。
定点数乘法运算
一、原码一位乘
特点:符号位与数值为分开求。乘积符号位由两个数的符号位异或形成。
设[X]原=xsx₁x₂x₃…xn,[Y]原=ysy₁y₂y₃…yn,则运算规则为:
①乘数和被乘数取绝对值参与运算,符号位为异或结果。
②结果积的的长度去n+1位,初值为0,
③从乘数的最低位yn开始判断,若yn=1,则部分积加上被乘数|x|,然后右移一位,若yn=0,则部分积加上0,然后右移一位。
④重复步骤③,判断n次
考虑到运算时可能出现绝对值大于1的情况,而且此时并没有溢出,所以部分积和被乘数取双符号位
例:
设机器字长为5位(含一位符号位,n=4),x=-0.1101,y=0.1011,
采用原码一位乘法求x×y
解:|x|=00.1101,|y|=00.1011
高位部分积 低位部分积/乘数 说明
00.0000 101*1* | 丢失位 起始情况
+|x| 00.1101 末尾为1,+|x|
--------------------
00.1101
右移 00.0110 110*1* | 1 右移部分积和乘数
+|x| 00.1101 末尾为1,加|x|
--------------------
01.0011
右移 00.1001 111*0* | 11 右移部分积和乘数
+0 00.0000 末尾为0,加0
--------------------
00.1001
右移 00.0100 111*1* | 011 右移部分积和乘数
+|x| 00.1101 末尾为1,+|x|
--------------------
01.0001
右移 00.1000 1111 | 1011 右移部分积,
乘数全部移出
符号位:1⊕0=1,得x×y=-0.10001111
二、补码一位乘(Booth算法)
有符号数的乘法。采用相加相减操作计算补码数据的乘积
设[X]原=xsx₁x₂x₃…xn,[Y]原=ysy₁y₂y₃…yn,则运算规则为:
①符号位参与运算,运算的数均以补码表示。
②被乘数一般取双符号位参与运算,部分积取双符号位,初值为0,乘数可取单符号位。
③乘数末位增设附加位yn+1,且初值为0.
④根据ynyn+1的取值来确定操作
yn yn+1 操作
0 0 部分积右移一位
0 1 部分积加[X]补,右移一位
1 0 部分积加[-X]补,右移一位
1 1 部分积右移一位
⑤移位按照补码右移规则进行
⑥按照上述算法进行n+1此操作,第n+1此操作不移位,即进行n+1次累加,n次右移。
例:设机器字长5位(含一位符号位,n=4),x=-0.1101,y=0.1011,采用Booth算法求x×y
[X]原=11.1101,[X]补=11.0011,[-X]补=00.1101,[y]补=00.1011.
高位部分积 低位部分积/乘数 说明
00.0000 0.101*1 | 0* 丢失位 起始情况(末尾附加位0)
+[-X]补 00.1101 10,0-1=-1加[-X]补,右移一位
-----------------------
00.1101
右移 00.0110 10.10*1 | 1*0 右移部分积和乘数
+0 00.0000 11,1-1=0,加0,右移一位
---------------------
00.0110
右移 00.0011 010.1*0 | 1*10 右移部分积和乘数
+[X]补 11.0011 01,1-0=1,加[X]补,右移一位
---------------------
11.0110
右移 11.1011 0010.*1 | 0*110 右移部分积和乘数
+[-X]补 00.1101 10,0-1=-1加[-X]补,右移一位
---------------------
00.1000
右移一位 00.0100 0001*0. | 1*0110 右移部分积和乘数
+[X]补 11.0011 01,1-0=1,加[X]补
---------------------
11.0111
最后一步不移位
高位部分积与低位部分积组成结果[x×y]补=1.01110001
x×y=-0.10001111
定点数除法运算
原码除法运算(不恢复余数法,也称原码加减交替法)
符号和数值分开进行计算
设[X]原=xsx₁x₂x₃…xn,[Y]原=ysy₁y₂y₃…yn,则运算规则为:
①商的符号:Qs=xs⊕ys
②先用被除数减去除数,余数为正时,商1,余数和商左移一位,再减去除数;余数为负时,商0,余数和商左移一位,再加上除数
③当第n+1步余数为负时,需加上|Y|得到第n+1步正确的余数(余数与被除数同号)
例:设机器字长为5位(含一位符号位,n=4),x=0.1011,y=0.1101.采用原码加减交替除法求x/y
解:
|x|=0.1011,|y|=0.1101,[|y|]补=0.1101,[|-y|]补=1.0011
被除数 商 说明
0.1011 0.0000 起始情况
+[|-y|]补 1.0011 +[|-y|]补
----------------------
1.1110 0.000*0* 余数为负,商0,左移
左移一位 1.1100 0.00*0*0
+[|y|]补 0.1101 0.00*0*0 +[|y|]补
----------------------
0.1001 0.00*01* 余数为正,商1,左移,减去除数
左移一位 1.0010 0.0*01*0
+[|-y|]补 1.0011
---------------------
0.0101 0.0*011* 余数为正,商1,左移,减去除数
左移一位 0.1010 0.*011*0
+[|-y|]补 1.0011
---------------------
1.1101 0.*0110* 余数为负,商0,左移,加上除数
左移一位 1.1010 *0.110*0
+[|y|]补 0.1101
---------------------
0.0111 *0.1101* 余数为正,商1
符号位:0⊕0=0,得x/y=+0.1101,余0.0111×2-4.
补码除法运算(加减交替法)
补码一位除法的特点是,符号位与数值为一起参加运算。商符自然形成。