【计算机组成原理】二、数据的表示和运算:2.定点数、浮点数的表示和运算(原码、反码、补码、移码的转换,原码补码的加减乘除运算、移位运算(Booth算法),IEEE标准)

定点数、浮点数的表示和运算

2.定点数

根据小数点的位置是否固定,在计算机中有两种数据格式:定点表示浮点表示。定点表示的数称为定点数,浮点表示的数称浮点数

采用定点数的机器称为定点机。


定点数:小数点位置固定

eg:12.003(常规计数)

2.1表示

2.1.1无符号数

整个机器字长全部二进制都是数值位,没有符号位,相当于数的绝对值。

unsigned short a=1;	//无符号整数短整型(短整型,2B字节)
unsigned int b=2;	//无符号整型,4B字节

int c=3;			//带符号整形

假设机器字长是8位,通用寄存器就存8位。

1B=8bit有28=256种状态(0~255)

当然,现在机器大多数32位,64位。

int是4字节(Byte),那么就有232 = 4,294,967,296,因为是带符号整数类型,那么32位机器的int能表示的范围是-231~231-1。最大数字是2,147,483,647

2.1.2有符号数

在定点机中,由于小数点的位置固定不变,故当机器处理的数不是纯小数或纯整数时,必须乘上一个比例因子,否则将溢出

定点表示即约定机器数中小数点位置是固定不变的,小数点不再使用“.”表示,而是约定它的位置。通常采用两种约定,把把整数小数分开,单独保存。0/1 对应 +/-

  • 定点整数:将小数点的位置固定在数据的最低位之后。

定点整数是纯整数,
当x0=0,其余均为1时,x为最大正数2n-1。
当x0=1,其余均为1时,x为其(原码)所能表示的最大负数-(2n-1)。

  • 定点小数:将小数点的位置固定在数据的最高位之前。

定点小数是纯小数,约定小数点位置在符号位之后、有效数值部分最高位之前。若数据X的形式为X=x0.x1x2…xn(其中x0为符号位,x1~xn是数值的有效部分,也称尾数,x1为最高有效位),则在计算机中的表示形式为:(设机器字长为n+1位)。

当x0=0,其余均为1时,X为最大正数1-2-n
当x0=1,其余均为1时,X为其(原码)所能表示的最大负数-(1-2-n)。

在这里插入图片描述

eg:[x]原=1,0010011。则前面 1 表示 -,后面0010011则是机器字,就是-0010011

[x]原=1.0010011。则前面1表示-,后面0010011则是机器字,就是-0.0010011

注意:真值0也有**-0+0**两种形式

❗原反补移
  • 原码:符号位不能参与运算。

范围:-2n-1~2n-1(-127~127)

[+127]原码=01111111; [-127]原码=11111111
原码中有正0与负0,[+0]原码=0000000;[-0]原码=10000000

  • 反码:由原码求补码的中间过渡。

范围:-2n-1~2n-1(-127~127)

[+127]反码=01111111;[-127]反码=10000000
反码中0也有正0和负0,[+0]反码=00000000;[-0]反码=11111111

  • 补码:符号位可以参与运算(所以都用这个)。

范围:-2n~2n-1(-128~127)

[+127]补码=01111111;[-127]补码=10000001

0的补码唯一,即[+0]补码=[-0]补码=00000000。我此刻可以发现,对比原码和反码,我们发现补码中少了一个0的编码,就是10000000(在原码和反码中表示-0)这个编码,因此在补码中,将这个多出来10000000进行扩充,用它来表示-128,因此补码的取值范围位-128~127。

  • 移码:补码的基础上将符号位取反,只能用于整数,不能表示小数。

范围:-2n~2n-1(-128~127)
移码和补码对比:

在这里插入图片描述

原反补移码的转换:

在这里插入图片描述

在这里插入图片描述

范围:

在这里插入图片描述

在这里插入图片描述

判断溢出
方法一

一位符号位设A的符号为As,B的符号为Bs,运算结果的符号为Ss,则溢出逻辑表达式为:(S’表示S非)
V = A s B s S s ′ + A s ′ B s ′ S s V=A_sB_sS_s'+A_s'B_s'S_s V=AsBsSs+AsBsSs

  • V=0,表示无溢出。
  • V=1,表示溢出。
    在这里插入图片描述
方法二

采用一位符号位,根据数据位进位情况判断溢出,符号位的进位Cs,最高数值位的进位C1。

在这里插入图片描述

Cs与C1不同时有溢出。溢出逻辑判断表达式为:
V = C s ⊕ C 1 V=C_s⊕C_1 V=CsC1

  • V=0,相同,表示无溢出。
  • V=1,不同,表示溢出。
方法三

采用双符号位正数符号为00,负数符号为11。

eg.:[A+C]补=00,0001111+00,1111100=01,0001011发生上溢

记两个符号位为Ss1,Ss2
V = S s 1 ⊕ S s 2 V=S_{s1}⊕S_{s2} V=Ss1Ss2

  • V=0,相同,表示无溢出。
  • V=1,不同,表示溢出。
模4补码

补充:双符号位的异或运算又可以叫做模4运算(模4补码),双符号位的移位操作只有低符号位需要参加移位操作。每个模4补码存储时只需一个符号位。

2.1.3符号扩展

在这里插入图片描述

例题:对真值0表示形式唯一的机器数是()

答案:补码和移码

例题:若定点整数为64位,含一位符号位,采用补码表示,所能表示的绝对值最大负数为()

答案:-2^{63}

例题:5位二进制定点小数,用补码表示时,最小负数是()
  A.0.111  B.1.0001  C.1.111  D.1.0000

答案:D;

例题:下列关于补码和移码关系的叙述中,()是不正确的
  A.相同位数的补码和移码表示具有相同的数据表示范围
  B.0的补码和移码表示相同
  C.同一个数的补码和移码表示,其数值部分相同,而符号相反
  D.一般用移码表示浮点数的阶,而补码表示定点整数

答案:B

例题:若[x]补=1,x_1x_2x_3x_4x_5x_6,其中xi取0 or 1,若要x>-32,应当满足
  A.x1为0,其他各位任意
  B.x1为1,其他各位任意
  C.x1为1,x2…x6中至少有1位为1
  D.x1为0,x2…x6中至少有1位为1

答案:C

例题:设x为整数,[x]补=1,x1x2x3x4x5,若要x<-16,应当满足
  A.x1~x5至少有一个为1
  B.x1为0,x2~x5至少有一个为1
  C.x1为0,x2~x5任意
  D.x1为1,x2~x5任意

答案:C

例题:设x为真值,x*为其绝对值,满足 [ -x * ]补=[ -x ]补,当且仅当()
  A.x任意  B.x为正数  C.x为负数  D.以上说法都不对

答案:D;当且仅当x为正数或0时

例题:关于模4补码,下列说法正确的是()
  A.模4补码和模2补码不同,它更容易检查乘除运算中的溢出问题
  B.每个模4补码存储时只需一个符号位
  C.存储每个模4补码需要两个符号位
  D.模4补码,在算术与逻辑部件中为一个符号位

答案:B;模4补码具有模2补码的全部优点且更易检查加减运算中的溢出问题,而不是乘除运算;存储模4补码仅需一个符号位,因为任何一个正确的数值,模4补码的两个符号位总是相同的,只在把两个模4补码的数送往ALU完成加减运算时,才把每个数的符号位的值同时送到ALU的双符号位中,即只在ALU中采用双符号位

例题:若寄存器内容为10000000,若它等于-0,则为()
  A.原码  B.补码  C.反码  D.移码

答案:A;值等于-0说明只有可能是原码或反码(因为补码和移码表示0时是唯一的)

例题:在计算机中,通常用来表示主存地址的是()
  A.移码  B.补码  C.原码  D.无符号数

答案:D。

例题:由3个1和5个0组成的8位二进制补码,能表示的最小整数是()

答案:-125,[1,000 0011]补 = [1,000 0010]反 = [1,111 1101]原,就是-125。

例题:证明:在定点小数表示中,[x]补+[y]补=2+(x+y)=[x+y]补

答案:分四种情况;(1)x>0,y>0:[x]补+[y]补=x+y=[x+y]补=2+x+y(mod 2);
  (2)x>0,y<0:x+y有大于或小于0两种情况,[x]补+[y]补=2+x+y;若x+y>0,进位2丢失,[x]补+[y]补=x+y,又[x+y]补=x+y,得证。若x+y<0,[x+y]补=2+x+y,得证。
  (3)x<0,y>0,与(2)同,把xy互换即可
  (4)x<0,y<0:[x]补+[y]补=2+(2+x+y),因为1<2+x+y<2,进位2丢失,[x]补+[y]补=2+x+y=[x+y]补
结论:在模2意义下,任意两数的补码之和等于两数之和的补码,对定点整数也成立。

例题:假设有2个整数x和y,x=-68,y=-80,采用补码形式(含1位符号位)表示,x和y分别存放在寄存器A和B中。另外,还有两个寄存器C和D。ABCD都是8位的寄存器。请回答下列问题(二进制序列要求用16进制表示)
  (1)寄存器A和B中的内容分别是什么
  (2)x和y相加后的结果存放在寄存器C中,寄存器C中的内容是什么?此时,溢出标志位OF是什么?符号标志位SF是什么?进位标志位CF是什么?
  (3)x和y相减后的结果存放在寄存器D中,寄存器D中的内容是什么?此时,溢出标志位OF是什么?符号标志位SF是什么?进位标志位CF是什么?

答案:(1)A、B内容分别为BCH、B0H;(2)6CH,OF=1,SF=0,CF=1;(3)0CH,OF=0,SF=0,CF=1

2.2运算

2.2.1标志位

在这里插入图片描述

多路选择器判断操作是加法还是减法。

标志位说明:

  • OF,overflow flag

含义:有符号数的加减运算是否发生了溢出。OF=1时,说明发生了溢出

硬件的计算方法:OF=最高位产生的进位 ⊕ 次高位产生的进位。
(进位:就是最高位和次高位竖着的两个数字相加之后向前进的那一个数字)

注意: OF位仅对有符号数的加减法有意义。

  • SF,sign flag

含义:有符号数加减运算结果的正负性。SF=0表示运算结果为正数,SF=1表示运算结果为负数。

硬件的计算方法:SF=最高位的本位和(就是最高位的竖着的两个数字相加之后的和)。

注意:SF位仅对有符号数的加减法有意义。

  • ZF,zero flag

含义:表示运算结果是否为0。ZF=1表示运算结果为0,ZF=0表示运算结果非0。

硬件的计算方法:两个数的运算结果为n bit,只有n bit全为0时,ZF=1。

  • CF,carry flag

含义:进位/借位标志,表示无符号数的加减法是否发生了进位或借位。当CF=1时,说明无符号数的加减运算发生了进位或借位,也即发生了溢出

硬件的计算方法:CF = 最高位产生的进位 ⊕ sub(这里的sub:)

  • sub=0表示加法
  • sub=1表示减法

注意:CF位仅对无符号数的加减法有意义。

2.2.2移位运算
算术移位

原码移位:符号保持不变,仅数值进行移位

右移:高位加0,低位减0。相当于**/2**(因为是2进制)。但是若减去(移出去)的不是0(移出去1)就会丢失精度。

左移:高位减0,低位加0。相当于×2。若减去的不是0就会严重误差。

在这里插入图片描述

在这里插入图片描述

逻辑移位

对无符号数的移位,逻辑移位不管是左移还是右移,都填0。

在这里插入图片描述

循环移位

用移除的位补上空缺的位。

00110011循环左移,就把左边的0拿走放在最右边:01100110。

进位位CF循环左移,1,00110011这里多了一个1在最前面,循环时,把最前面的1直接放到最右面(后面),然后把前面第一位推进到CF位。

例题:一个8位寄存器内的数值为1100 1010,进位标志寄存器CF为0,若将此8位寄存器循环左移(不带进位位)1位,则该8位寄存器和标志寄存器内的数值分别为()

答案:1001 0101 ; 1

例题:已知32位寄存器R1中存放的变量x的机器码为8000 0004H,当x为int类型时,乘除法采用移位操作。
x的真值是多少?
x/2的真值是多少?
x/2存放在R1中的机器码是什么?
2x的真值是多少?
2x存放在R1中的机器码是多少?

答案:x为补码,x的真值为4-231,
x/2的真值为2-230,
x/2的机器码为C000 0002H,
2x的真值为8-232,发生溢出(能表示的最小数为-231),
2x的机器码为8000 0008H

例题:下列关于各种移位的说法正确的是()
  1.假设机器数采用反码表示,当机器数为时,左移时最高数位丢0,结果出错;右移时最低数位丢0,影响精度
  2.在算术移位的情况下,补码左移的前提条件是其原最高有效位与原符号位要相同
  3.在算术移位的情况下,双符号位的移位操作只有低符号位需要参加移位操作
  A.1,3  B.2  C.3  D.1,2,3

答案:D;双符号位的最高符号位代表真正的符号,而低位符号位用于参与移位操作以判断是否发生溢出

2.2.3加减运算
原码加减

用加法代替减法

在钟表12位内,10-7=3

12-3=9

那么,用10+9=19

19/12=1…7

即19mod12=7(模运算)

补码加减

计算机系统中普遍采用补码加减运算。补码运算符号位与数值位按同样规则一起参与运算,符号位运算产生的进位要丢掉,结果的符号位由运算得出。公式:

在这里插入图片描述

  • n bit补码 X+Y:按位相加即
  • n bit补码 X-Y:正数的原反补码全部一样,所以将补码Y全部按位取反,末位+1,得到[-Y]补,减法变加法

例1: 4bit补码, X=-8, Y=7。[X]补=1000, [Y]补=0111。

[X+Y]补 = 1111B

[-Y]补 = 1001B

[X-Y]补 = 1000 + (1001) = 10001B
运算结果只保留低四位,最高位进位丢弃(发生溢出)

例2: 4bit补码, X=3, Y=4。 [X]补=0011, [Y]补=0100

[X+Y]补 = 0111B

[-Y] = 1011+1 = 1100B

[X-Y]补 = 0011 + 1100 = 1111B

例:机器字长为8位(含一位符号位),A=15,B=24,求[A+B]补和[A-B]补。

[A]补=00001111,[B]补=00011000,[-B]补=11101000

[A+B]补=00100111,对应真值39,

[A-B]补=11110111,对应真值-9

注意:这里机器字长为8位,所以M=256,所以256-24=232,就是[-B]补,就是11101000

2.2.4乘法运算

乘法操作由累加逻辑移位操作实现。根据机器数的不同,可分为原码一位乘法和补码一位乘法(现在都用补码一位乘法)。

在这里插入图片描述

乘法实现原理

手算乘法十进制:

在这里插入图片描述

手算乘法二进制:

在这里插入图片描述

原码一位乘法

原码一位乘法的特点是符号位与数值位是分开求的
1.乘积符号由两个数的符号位异或形成,
2.而乘积的数值部分是两个数的绝对值相乘之积。

考虑到运算时可能出现绝对值大于1的情况(进位时最高位改变的情况,但此刻并非溢出;若取单个符号位,最高位改变可能被当成溢出处理),所以部分积和被乘数取双符号位

例:设机器字长为8位,x = - 0.1101,y = 0.1011,采用原码一位乘法求p=[x*y]原。

符号p_f是符号位异或1⊕0是1,就是负。
|x|=00.1101,|y|=00.1011

  1. 初始,(高位)部分积p与|x|长度一致,且p=0。

  2. 判断y的最后一位y_n(这里是C4):
    C4=1,p+|x|(这里的加其实就是运算)
    C4=0,p+0
    y逻辑右移一位,左边补充的就是p计算出的结果最后一位。

  3. 重复2的操作n次。

在这里插入图片描述

得x * y = - 0.1000 1111

补码一位乘法(Booth算法)

累加算数移位操作实现,但最后还要再来一次加法。符号位参与运算,[][][p]补=[x]补*[y]补。

x是被乘数,y是乘数。被乘数x采用双符号位。00为正,11为负,01或10则可能溢出

例:设机器字长为5位(含一位符号位,n=4),x = - 0.1101,y = 0.1011,采用Booth算法求x*y。

[x]补是原码取反+1,
[-x]补是[x]补连同符号位都取反+1。

注意:正数原反补都一样。

在机器里面通常会有辅助电路来实现[-x]补的计算。

[x]补=11.0011,[-x]补=00.1101,[y]补=0.1011

  1. 初始,(高位)部分积p与|x|长度一致,且初始p=0。

  2. 乘数y用单符号位,用来决定最后一位是否需要校正(是否加上[-x]补)。

  3. y末尾增加附加位y_{n+1},初始值为0。

  4. 根据(y_n,y_{n+1})表来决定操作。

在这里插入图片描述

  1. y算数右移一位,左边补充的就是p计算出的结果最后一位。
  2. 重复4的操作n次。

在这里插入图片描述

得[x * y]补 = 1.0111 0001,x * y = - 0.1000 1111

2.2.5除法运算(考的不多)

除法运算可转换成累加为左移(逻辑左移),根据机器数的不同,可分为原码除法和补码除法(常用不恢复余数)。

2定点除法

原码一位除法(不恢复余数法)

原码不恢复余数法,也称原码加减交替除法。特点是商符和商值分开进行,|x|<|y|
1.商符由两个操作数的符号位异或形成,
2.q=|x|/|y|。

例:设机器字长为5位(含一位符号位,n=4),x=0.1011,y=0.1101,采用原码加减交替除法求x/y。

|x|=0.1011,|y|=0.1101,[|y|]补=0.1101,[-|y|]补=1.0011

  1. 初始余数r=被除数x,商q=0

  2. 余数r = 被除数x - 除数y

    1. r为正,商q上1,余数左移1位,减去除数(就是加上负的除数)

    2. r为负,商q上0,余数左移1位,加上除数

  3. 重复n+1次(5次)步骤2的操作

  4. 当n+1步余数是负,需要加上|y|,得到第n+1步的正确的余数,最后的余数是:

r n ∗ 2 − n r^n * 2^{-n} rn2n

在这里插入图片描述

Q=xf⊕yf=0,得q=x/y=+0.1101,余0.0111*2-4(rn=0.0111)

补码一位除法(加减交替法)

特点是符号位与数值位一起参与运算,商符自然形成。除数与被除数都用双位补码表示。

例:设机器字长为5位(含一位符号位,n=4),x=0.1000,y=-0.1011,采用补码加减交替除法求x/y。

采用2位符号位,[x]原=00.1000,[x]补=00.1000,[y]原=11.1011,
[y]补=11.0101,[-y]补=00.1011

  1. 初始余数r=被除数x,商q=0

  2. 比较被除数x,除数y(余数有关)

    1. 同号时,x-y
    2. 异号时,x+y
  3. 比较余数r,除数y(商进位)

    1. 同号,商q上1,余数左移1位,减去除数(就是加上负的除数)
    2. 异号,商q上0,余数左移1位,加上除数
  4. 采用校正法,包括符号位,重复操作3 的n+1次

  5. 校正法则

    1. 商刚好能除尽(余数r=0)
      1. 除数为正,商不必校正
      2. 除数为负,商校正,加上2^-n
    2. 商不能除尽
      1. 商为正,商不必校正
      2. 商为负,商加上2^-n
  6. 余数r与被除数x异号时(余数校正)

    1. 商为正,r+y
    2. 商为负,r-y

在这里插入图片描述

得[x/y]补=1.0101,余0.0111 x 2-4

2.3 C语言中的整数类型及类型转换

强制类型转换的结果保持位值不变,仅改变了解释这些位的方式。

int main()
{
	short x=-4321;
	unsigned short y=(unsigned short)x;
	printf("x=%d,y=%u\n",x,y);
}

x=-4321,y=61215

因为x=(1110 1111 0001 1111)2,y=(1110 1111 0001 1111)2

x为补码表示,y为无符号的二进制真值,被解释为61215。将short int 强制转换成unsigned short 只改变数值,而两个变量对应的每一位都是一样的。

当大字长变量向小字长变量强制类型转换时,系统把多余的高位字长部分直接截断,低位直接赋值。

3.浮点数

小数点位置不固定

eg:1.2003*10(科学计数法)

定点、浮点的区别

  • 数值的表示范围
    若定点数和浮点数的字长相同,则浮点表示法所能表示的数值范围将远远大于定点表示法。

  • 精度
    精度指一个数所含有效数值位的位数。对于字长相同的定点数和浮点数来说,浮点数虽然扩大了数的表示范围,但精度降低了(要用字长的一部分表示阶码,尾数部位的有效位数减少)。

  • 数的运算
    浮点数包括阶码和尾数两部分,运算时不仅要做尾数的运算,还要做阶码的运算,而且运算结果要求规格化。

  • 溢出问题
    在定点运算中,当运算结果超出数的表示范围时,发生溢出;浮点运算中,运算结果超出尾数表示范围时不一定溢出,只有规格化后阶码超出所能表示的范围时,才发生溢出。

3.1表示

在这里插入图片描述

阶符为正,小 数点就往后移。反则往前。

浮点数的真值 N = r E ∗ M 浮点数的真值N=r^E*M 浮点数的真值N=rEM

阶码E:用补码、移码表示的定点整数

尾数M:用原码、补码表示的定点小数。反应浮点的精度
规格化浮点数的尾数M的绝对值应满足条件1/r<=|M|<=1。
若r=2,则有1/2<=|M|<=1。

阶码的底r:就是进制。通常是2

eg:a=0, 01; 1.1001

前面0, 01对应E=+1,

后面1.1001是定点小数(补码)对应M= -0.0111

a的真值 = 2 1 ∗ ( − 0.0111 ) = − 0.111 2^1*(-0.0111)=-0.111 21(0.0111)=0.111

【技巧】*2表示前移(左移),/2表示后移。

*22表示左移两位。

规格化浮点数

为提高运算的精度,需充分利用尾数的有效数位,通常采取浮点数规格化形式,即规定尾数的最高数位必须是一个有效值。非规格化浮点数需要进行规格化操作才能变成规格化浮点数。

规格化操作:指通过调整一个非规格化浮点数的尾数和阶码的大小,使非0的浮点数在尾数的最高数位上保证是一个有效值。

左规:将尾数算术左移一位、阶码减1(基数为2时)的方法称为左规,左规可能要进行多次

右规:当浮点数运算的结果尾数出现溢出(双符号位为01或10)时,将尾数算术右移一位,阶码加1(基数为2时)的方法称为右规。需要右规时,只需进行一次

规格化表示的尾数形式如下:

  • 原码规格化后

正数为0.1xx…x的形式,其最大值表示为0.11…1,最小值表示为0.100…0。尾数的表示范围为1/2<=M<=(1-2-n)。

负数为1.1xx…x的形式,其最大值表示为1.10…0,最小值表示为1.11…1。尾数的表示范围为-(1-2-n)<=M<=-1/2。

  • 补码规格化后

正数为0.1xx…x的形式,其最大值表示为0.11…1,最小值表示为0.100…0。尾数的表示范围为1/2<=M<=(1-2-n)。

负数为1.0xx…x的形式,其最大值表示为1.01…1,最小值表示为1.00…0。尾数的表示范围为-1<=M<=-(1/2+2n)。


当浮点数尾数的基数为2时,原码规格化数的尾数最高位一定是1,补码规格化数的尾数最高位一定与尾数符号位相反。基数不同,浮点数的规格化形式也不同。

当基数为4时,原码规格化形式的尾数最高2位不全为0,规格化时,尾数左/右移2位,阶码减/加1;当基数为8时,原码规格化形式的尾数最高3位不全为0,规格化时,尾数左/右移3位,阶码减/加1。

例题:采用规格化的浮点数最主要是为了()
  A.增加数据的表示范围  B.方便浮点运算
  C.防止运算时数据溢出  D.增加数据的表示精度

答案:D;

例题:设浮点数共12位。其中阶码含1位阶符共4位,以2为底,补码表示;尾数含1位数符共8位,补码表示,规格化。则该浮点数所能表示的最大正数是()

答案:2^7-1;

例题:已知X=-0.875 x 21,Y=0.625 x 22,设浮点数格式为阶符1位,阶码2位,数符1位,尾数3位,通过补码求出Z=X-Y的二进制浮点数规格化结果是()

答案:0111011;浮点数表示为:X=001 1001 Y=010 0101;
  -Y=010 1011;X的尾数部分为11.001,右规后为11.100;-Y的尾数部分为11.011,X、-Y尾数相加(运算时采用双符号位,但存储时只存储一位符号位即可),得10.111,右规得11.011(双符号位的最高符号位代表真正的符号,而低位符号位用于参与移位操作以判断是否发生溢出。双符号位设置的意义就在于用低符号位容纳最高数位产生的进位,而用高符号位表示真正的符号。双符号位10右规符号位变成11,双符号位01右规符号位变成00,10表示负溢出,右规之后还是负数,即变成11),最后的结果为0111011

例题:已知十进制数x=-5/256、y=+59/1024,按机器补码浮点运算规则计算x-y,结果用二进制表示,浮点数格式如下:阶符取2位,阶码取3位,数符取2位,尾数取9位

答案:11101,11.011000100

例题:设浮点数字长32位,其中阶码部分8位(含一位阶符),尾数部分24位(含1位数符),当阶码的基值分别是2和16时:
  (1)说明基值2和16在浮点数中如何表示
  (2)当阶码和尾数均用补码表示,且尾数采用规格化形式时,给出两种情况下所能表示的最大正数真值和非零最小正数真值
  (3)在哪种基值情况下,数的表示范围大
  (4)两种基值情况下,对阶和规格化操作有何不同

答案:(1)浮点机中一旦基值确定了就不会再改变,所以基值2和16在浮点数中是隐含表示的,并不出现在浮点数中;
  (2)r=2时,最大正数真值2127 x (1-2-23),最小正数真值2-129
  r=16时,最大正数真值16127 x (1-2-23),最小正数真值16-129(尾数数据位最高4位不全为0)
  (3)r=16时,数的表示范围大
  (4)对阶中,需要小阶向大阶看齐,基值为2的浮点数尾数右移一位,阶码加1,基值为16的浮点数尾数右移4位,阶码加1。规格化时,若为原码规格化,若基值为2的浮点数尾数最高有效位出现0,需尾数左移1位,阶码减1;当基数为16时,原码规格化形式的尾数最高4位若全为0,尾数左移4位,阶码减1

例题:两个规格化浮点数进行加减法运算,最后对结果规格化时,能否确定需要右规的次数?能否确定需要左规的次数?

答案:两个n位数的加减运算,其和/差最多为n+1位,因此有可能需要右规,但右规最多一次。由于异号数相加或同号数相减,其和/差的最少位数无法确定,因此左规的次数也无法确定,但最多不会超过尾数的字长n位次(正数最多n-1次,负数最多n次)。

IEEE754标准

在这里插入图片描述

IEEE754标准规定常用的浮点数格式有短浮点数(单精度、float型)、长浮点数(双精度、double型)、临时浮点数。

在这里插入图片描述

以短浮点数为例,

最高位为数符位,
其后是8位阶码,以2为底,用移码表示,阶码的偏置值为28-1-1=127;

其后23位是原码表示的尾数数值位。

对于规格化的2进制浮点数,数值的最高位总是1,为了能使尾数多表示一位有效位,将这个1隐含,因此尾数数值实际上是24位。隐含的1是一位整数。在浮点格式中表示的23位尾数是纯小数

例如,12D=1100B,规格化后结果为1.1x23,其中整数部分的1将不存储在23位尾数内。

短浮点数与长浮点数都采用隐含尾数最高数位的方法,临时浮点数又称扩展精度浮点数,无隐含位。


移码
  • 为何要用移码表示阶码
  1. 移码比较大小更方便
  2. 检验移码的特殊值时较容易

移码 = 真值 + 偏置值

偏置值为127(0111 1111B),而非128的原因是:指数可以为正数也可以为负数,为将负数转变为正数(为了不在阶码中引入阶符),实际的指数值要加上偏置值。

-127 ~ +127加上127即得到 0 ~ +254,然而阶码值E的范围为1~254,因为阶码为0时表示指数为负无穷大,整个数无穷接近于0,可将0用于表示0(尾数也为0时)或非规格化数(尾数不为0时)。

为什么不加128呢?因为255为8位全1,也有特殊用途,当阶码值为255时(指数为正无穷),若尾数部分为0,则表示无穷大;若尾数部分不为0,则认为这是一个“非数值”(浮点数运算错误)。

对于短浮点数,偏置值为127;对于长浮点数,偏置值为1023。存储浮点数阶码部分之前,偏置值要先加到阶码真值上。例如1.1x23,阶码值为3,在短浮点数中,移码表示的阶码为130(82H);在长浮点数中,阶码为1026(402H)

  • IEEE 754单精度浮点型能表示的最小绝对值、最大绝对值是多少?

**理论上可以表示 -128 ~ 127,但是 -128(11111111) 和 -127(00000000)有特殊的用途。**所以就最多到 -126。

最小绝对值:尾数全为0,阶码真值最小 -126,对应移码机器数0000 0001此时整体的真值为 ( 1.0 ) 2 × 2 − 126 (1.0)_2 × 2^{-126} (1.0)2×2126

最大绝对值:尾数全为1,阶码真值最大127,对应移码机器数1111 1110此时整体的真值为 (1.111…11)2 ×2127

短浮点数(32)例子:

在这里插入图片描述

例题:按照IEEE754标准规定的32位浮点数(41A4C000)16对应的10进制数是()
     A.4.59375  B.-20.59375  C.-4.59375  D.20.59375

答案:D;

例题:假定采用IEEE754标准中的单精度浮点数格式表示一个数为45100000H,则该数的值是()
     A.(+1.125)10 x 210  B.(+1.125)10 x 211
     C.(+0.125)10 x 211  D.(+0.125)10 x 210

答案:B;

例题:已知两个实数x=-68,y=-8.25,它们在C语言中定义为float型变量,分别存放在寄存器A和B中。另外还有两个寄存器C和D。ABCD都是32位的寄存器。请问(要求用16进制表示2进制序列)x和y相减后的结果存放在D中,D中的内容是什么

答案:IEEE754标准,x的浮点数表示为
     1 1000 0101 0001000 0000 0000 0000 0000
     即x=-1.0001 x 26
     y的浮点数表示为
     1 1000 0010 000 0100 0000 0000 0000 0000,对阶后为:
     1 1000 0101 001 0000 1000 0000 0000 0000,
     即y=-0.00100001 x 26
     进行尾数原码减法,得x-y=-0.11101111 x 26=-1.1101111 x 25,浮点表示为C26F0000H

例题:对下列每个IEEE754单精度数值,解释它们所表示的是哪种数字类型(规格化数、非规格化数、无穷大、0)。当它们表示某个具体数值时,给出该数值。
     (1)0b0000 0000 0000 0000 0000 0000 0000 0000
     (2)0b0100 0010 0100 0000 0000 0000 0000 0000
     (3)0b1000 0000 0100 0000 0000 0000 0000 0000
     (4)0b1111 1111 1000 0000 0000 0000 0000 0000

答案:前面的0b意思是数字的表示形式为二进制
   (1)+0;(2)规格化数,25 x (1.1)2;
     (3)非规格化数,尾数首位无隐藏的整数1,阶码全0时有特殊规定为
   2-126 ,因此(3)表示2-126 x (-0.1)2;
     (4)负无穷

范围(大纲已删除)

设阶码和尾数均用补码表示,阶码部分共K+1位(含一位阶符),尾数部分共n+1位(含一位数符),浮点数表示范围如下:

在这里插入图片描述

3.2运算

阶码运算和尾数运算分开进行。浮点数的加减运算一律采用补码

步骤如下:

1)对阶

对阶的目的是使两个操作数的小数点位置对齐,即使得两个数的阶码相等。先求阶差,然后以小阶向大阶看齐的原则,将阶码小的尾数右移一位(基数为2),阶加1,直到两个数的阶码相等为止。尾数右移时,舍弃掉有效位会产生误差,影响精度。

2)尾数求和

将对阶后的尾数按定点数加减运算规则计算。

3)规格化

以双符号位为例,当尾数大于0时,其补码规格化形式为:
[S]补=00.1xx…x

当尾数小于0时,其补码规格化形式为:
[S]补=11.0xx…x

当尾数的最高数值位与符号位不同时,即为规格化形式。规格化分为左规和右规。

  • 左规

    当尾数出现00.0xx…x或11.1xx…x时,需左规,尾数左移一位,阶码减1,直到尾数为00.1xx…x或11.0xx…x

  • 右规

    当尾数求和结果溢出(如尾数为10.xx…x或01.xx…x)时,需右规,尾数右移1位,阶码加1

4)舍入

在对阶和右规的过程中(进行了右移),可能会将尾数低位丢失,引起误差。常见的舍入方法有:0舍1入法恒置1法

  • 0舍1入法
    类似于4舍5入,尾数右移时,被移去的最高数值位为0,则舍去;被移去的最高数值位为1,则在尾数的末位加1。这样做可能会使尾数再一次溢出,此时需再做一次右规。

  • 恒置1法
    尾数右移时,都使右移后的尾数末位恒置1,此方法有使尾数变大和变小(尾数为负时)两种可能。

5)溢出判断

当尾数之和(差)出现10.xx…x或01.xx…x时,并不表示溢出,需将此数右规后,根据阶码判断结果是否溢出。

浮点数溢出与否是由阶码的符号决定的。以双符号位补码为例,当阶码的符号位出现01时,即阶码大于最大阶码,表示上溢,进入中断处理;当阶码的符号位出现10时, 阶码小于最小阶码,表示下溢,按机器零处理。

在这里插入图片描述

2.3_3_浮点数的运算_哔哩哔哩_bilibili

在这里插入图片描述

例题:浮点数加、减运算过程一般包括对阶、尾数运算、规格化、舍入和判断溢出等步骤。设浮点数的阶码和尾数均采用补码表示,且位数分别为5和7(均含2位符号位)。若有两个数X=27x29/32和Y=25x5/8,则用浮点加法计算X+Y的最终结果是()
  A.00111 1100010  B.00111 0100010  C.01000 0010001  D.溢出

答案:D;

例题:下列关于对阶操作说法正确的是()
  A.在浮点加减运算的对阶操作中,若阶码减小,则尾数左移
  B.在浮点加减运算的对阶操作中,若阶码增大,则尾数右移;若阶码减小,则尾数左移
  C.在浮点加减运算的对阶操作中,若阶码增大,则尾数右移
  D.以上都不对

答案:C;对阶操作,是将小的阶码调整到与大的阶码一致(小的向大的对齐),只可能尾数右移,因此不存在阶码减小,尾数左移的情况

例题:下列关于舍入的说法,正确的是()
  1.不仅仅只有浮点数需要舍入,定点数在运算时也可能要舍入
  2.在浮点数舍入中,只有左规时可能要舍入
  3.在浮点数舍入中,只有右规时可能要舍入
  4.在浮点数舍入中,左右规格化均可能要舍入
  5.舍入不一定产生误差

答案:5;舍入是浮点数的概念,定点数没有舍入的概念;浮点数舍入的情况有2种:对阶(对阶时需要尾数右移)与右规;舍入不一定产生误差。

3.3C语言中的浮点数类型及类型转换

C语言中的float和double类型分别对应于IEEE754单精度浮点数和双精度浮点数。long double类型对应于扩展双精度浮点数,但其长度和格式随编译器和处理器类型的不同而不同。在C程序中等式的赋值和判断中会出现强制类型转换,以char->int->long->doublefloat->double最为常见,从前到后范围和精度都从小到大,转换过程中没有损失。

在这里插入图片描述

  • 从int转换为float时,虽然不会发生溢出,但int可以保留32位,float保留24位(尾数+隐含位),可能有数据舍入,损失精度,若从int转换为double则不会出现。
  • 从int或float转换为double时,由于double的有效位数更多,因此能保留精确值。
  • 从double转换为float时,由于float表示范围更小,因此可能发生溢出,由于有效位数变少,可能被舍入,损失精度
  • 从float或double转换为int时,因为int没有小数部分,所以数据可能会向0方向被截断(仅保留整数部分),影响精度,由于int的表示范围更小,可能发生溢出
  • 12
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值