408计算机组成原理知识点——第二章 数据的表示和运算


注:内容参考王道2024考研复习指导

数制与编码

在计算机系统内部,所有信息都是用二进制进行编码的,这样做的原因有以下几点。

  1. 二进制只有两种状态,使用有两个稳定状态的物理器件就可以表示二进制数的每一位,制造成本比较低,例如用高低电平或电荷的正负极性都可以很方便地表示0和1。
  2. 二进制位1和0正好与逻辑值“真”和“假”相对应,为计算机实现逻辑运算和程序中的逻辑判断提供了便利条件。
  3. 二进制的编码和运算规则都很简单,通过逻辑门电路能方便地实现算术运算。

进位计数制

r进制计数法法

image-20240321193437459

基数:每个数码位用到的不同符号的个数,r进制的基数为r。

位权:用基数r的i次幂表示。

任意进制转十进制

需要将每位的数值和对应位权相乘再求和

image-20240321193927622

二进制转八进制、十六进制

二进制转八进制,需要每3位一组,每组转换成对应的八进制符号。八进制转二进制则将每位八进制转换成对应3位的二进制。

image-20240321194212026

二进制转十六进制,需要每4位一组,每组转换成对应的十六进制符号。十六进制转二进制则将每位十六进制转换成对应的4位二进制。

image-20240321194228073

各种进制的常见书写方式

二进制以下标2或者末尾B作为标识

八进制用下标8作为标识

十六进制以下标16或末尾H或者开头0x作为标识

十进制以下标10或者末尾D作为标识

image-20240321194339048

十进制转任意进制

需要整数部分和小数部分分开计算后再合并

以十进制转二进制为例:

  1. 整数部分,采用除基取余法。

用十进制数除以目标进制的基数,可以得到一个商和一个余数,余数作为目标进制数的低位表示,商作为下一次的被除数再次除以基数,循环直到商得零。

image-20240321194927062

  1. 小数部分,采用乘基取整法(小数部分可能会得到无限小数,需要按精度舍入)。

用十进制的小数数乘上目标进制的基数,可以得到一个积,取出积的整数部分,作为目标进制的小数部分的高位表示,将积剩余部分作为乘数进行下一次的乘基取整。直到乘积为1.0时结束或者达到精度要求。

image-20240321195225884

真值和机器数

image-20240321195412149

真值:符合人类习惯的数字,带正负号的数。

机器数:数字实际存到机器的形式,正负号需要被“数字化”。

定点数的编码表示

定点数,小数点的位置固定,例如十进制下的常规计数,996.007

浮点数,小数点的位置不固定,例如十进制下的科学技术法表示,9.96007*10^2

二进制的定点数、浮点数与之类似。

无符号数的表示

通常只有无符号整数,没有无符号小数

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

image-20240321200239164

对于n位的无符号数,其表示范围为: 0 ∼ 2 n − 1 0 \sim 2^{n-1} 02n1

有符号数的表示

  1. 整数+小数:例如1.24、10.34,小数点在指定某个位置

image-20240321200620191

有符号数的定点表示

  1. 纯整数:例如整数100,小数点其实在最后一位,所以忽略不写
  2. 纯小数:例如:0.123,小数点固定在最高位

image-20240321200644908

:可用原码、反码、补码三种方式来表示定点整数和定点小数。还可用移码表示定点整数。若真值为x,则用[x]原、[x]反、[x]补、[x]移分别表示真值所对应的原码、反码、补码、移码。

原码

用尾数表示真值的绝对值,符号位“0/1”对应“正/负”。若机器字长为n+1位,则尾数占n位。

image-20240321201331748

对于+19D和-19D,字长为8位的机器数原码表示如上图所示,-19D的原码可写为[x]原=10010011,第一位为符号位。

image-20240321201609554

对于-0.75D和+0.75D,字长为8位的机器数原码表示如上图所示,-0.75D的原码可写为[x]原=1.1100000,小数点前的一位为符号位。

  • 若机器字长为n+1位,原码整数的表示范围: − ( 2 n − 1 ) ≤ x ≤ 2 n − 1 -(2^n-1) \leq x \leq 2^n-1 (2n1)x2n1,关于原点对称。真值有+0和-0两种形式。

  • 若机器字长为n+1位,原码小数的表示范围: − ( 1 − 2 − n ) ≤ x ≤ 1 − 2 − n -(1-2^{-n}) \leq x \leq 1-2^{-n} (12n)x12n,关于原点对称。真值有+0和-0两种形式。

反码

反码,若符号位为0,则反码与原码相同;若符号位为1,则数值位全部取反。

反码只是原码转变为补码的一个中间状态,实际无用。

image-20240321202411999

反码的表示范围和原码的表示范围一致。

补码

正数的补码等于原码,负数的补码等于反码末位加1(考虑包括符号位在内的进位)。

将负数补码转回原码的方法相同,尾数取反,末位加1。即[[X]补]补=[X]原。

image-20240321204736943

补码中,真值0只有一种表示形式。

image-20240321204727176

定点整数补码[x]补=10000000表示 x = − 2 7 x=-2^7 x=27

  • 若机器字长为n+1位,补码整数的表示范围: − ( 2 n ) ≤ x ≤ 2 n − 1 -(2^n) \leq x \leq 2^n-1 (2n)x2n1,比原码表示多一个 − 2 n -2^n 2n(即原来-0的表示,人为规定为 − 2 n -2^n 2n)。

  • 若机器字长为n+1位,补码小数的表示范围: − 1 ≤ x ≤ 1 − 2 − n -1 \leq x \leq 1-2^{-n} 1x12n,比原码表示多一个-1。

:对于已知[X]补,求[-X]补,则需要符号位和数值位取反(全部取反),末尾加1可以得到。

或者可以找出[X]补最右边的1,将其左边(包括符号位,不包括本身)的数字全部取反,也可以得到。

移码

移码,在补码的基础上将符号位取反。

:移码只能用于表示整数

image-20240321205449231

移码的表示范围与补码的定点整数的表示范围相同。

移码表示的整数很方便进行大小对比,如下图所示:

image-20240321205600755

用几种码表示定点整数

image-20240321205700397

原码和反码的真值0有两种表示,补码和移码的真值0只有一种表示,补码和移码可以多表示一个负数。

##零扩展&符号扩展

为什么需要对数据进行长度扩展?

  1. ALU的位数是固定的,运算前可能需要把短数据扩展为长数据
  2. 通用寄存器位数是固定的,把数据存入寄存器时,可能需要进行长度扩展
  3. 主存内的各种数据长度不一,有时需要把短数据扩展为长数据

零扩展:适用于无符号整数,用0扩展高位

符号扩展:适用于带符号整数(补码),用符号位扩展高位

image-20240323090951349

C语言中的强制类型转换

:C语言中的定点整数使用补码存储的。

无符号数与有符号数:不改变数据内容,改变解释方式。

长整数变短整数:高位截断,保留低位。

短整数变长整数:符号扩展

image-20240323091155348

:若同时有无符号数和有符号数参与运算,则C语言标准规定按无符号数进行运算。

运算方法和运算电路

逻辑门电路基础

总结

image-20240321211130411

门电路变形画法

image-20240321211223719

加法器

加法器的基本功能

7+12=19,用8bit表示被加数A、加数B、和S。

image-20240321211345391

一位全加器

8bit的加法,每一位的加法计算过程如下所示,输入被加数的本位、加数的本位、来自低位的进位,输出本位和、向高位的进位。

其中,本位和 S i = A i ⊕ B i ⊕ C i − 1 S_i=A_i \oplus B_i \oplus C_{i-1} Si=AiBiCi1,输入中有奇数个1时输出1; C i = A i B i + ( A i ⊕ B i ) C i − 1 C_i=A_iB_i+(A_i \oplus B_i)C_{i-1} Ci=AiBi+(AiBi)Ci1,输入中至少2个1时输出1。

image-20240321211645715

逻辑电路经过封装后便构成了一位全加器,如图所示。

image-20240321212434699

n bit加法器

把n个一位全加器串联起来,就可以进行两个n bit数的相加。

image-20240321212411483

这种加法器的进位信息是串行产生的,位数越多,运算速度越慢。

  • 两个输入端允许并行输入n bit,属于并行加法器
  • 进位信息是串行产生的,属于串行进位加法器

综上,该加法器称为”串行进位的并行加法器“。

并行进位的并行加法器

image-20240321212822126

并行进位的并行加法器,各级进位信号同时形成,又称为先行进位、同时进位。

并行进位的并行加法器,所有进位信息都是同时产生的,几乎没有延迟。特点是运算速度比“串行进位的并行加法器”更快。

image-20240322082649342

通过刚开始已有的信息可以展开得到每一位的进位。如下图所示:

image-20240322082340983

结论:第i位向更高位的进位 C i C_i Ci可以根据被加数、加数的第 1 ∼ i 1 \sim i 1i位,再结合 C 0 C_0 C0即可确定。

带标志位的加法器

image-20240321213029406

各类表示说明如下:

  1. OF(Overflow Flag)溢出标志,用于判断带符号整数加减运算是否溢出。OF=1溢出;OF=0未溢出
  2. SF(Sign Flag)符号标志,用于判断带符号数加减运算结果的正负性。SF=1结果为负;SF=0结果为正
  3. ZF(Zero Flag)零标志,用于判断加减运算的结果是否为0。ZF=1表示结果为0;ZF=0表示结果不为0
  4. CF(Carry Flag)进位/借位标志,用于判断无符号数的加减运算是否溢出。CF=1溢出;CF=0未溢出
标志位的生成

image-20240321213632407

O F = C n ⊕ C n − 1 OF=C_n \oplus C_{n-1} OF=CnCn1,最高位的进位异或次高位的进位,反应带符号数加减运算是否溢出。

S F = S n SF=S_n SF=Sn,取运算结果的最高位(符号位),反应带符号数加减运算的正负性。

Z F = S n + . . . + S 2 + S 1 ‾ ZF=\overline{S_n+...+S_2+S_1} ZF=Sn+...+S2+S1,仅当运算结果所有bit全为0时,ZF才为1,此时表示运算结果为0。

C F = C o u t ⊕ C i n = C n ⊕ C 0 CF=C_{out} \oplus C_{in}=C_n \oplus C_0 CF=CoutCin=CnC0,反应无符号数加减运算是否溢出。

多路选择器&三态门

多路选择器

image-20240322082829112

多路选择器(multiplexer,MUX),作用是在多个输入数据中,只允许其中一个数据通过MUX。

图形通常用“梯形”表示,有多个输入、一个输出、一个控制信号(梯形的更长的一边是输入端、更短的一边是输出端)

若有 k k k个输入,则控制信号的位数 m ≥ ⌈ log ⁡ 2 k ⌉   b i t m \geq \lceil \log_2k \rceil \ bit mlog2k bit

:在电路图中,控制信号常用英文缩写“XXXop”表示,图形常用“虚线箭头”。

示例如下:

image-20240322083204918

三态门

image-20240322083245652

三态门,作用是根据控制信号决定是否让输入的数据通过。

图形是小三角。有一个输入、一个输出、一个控制信号。

三态门的控制信号通常只需要1bit。op=1表示允许数据通过;op=0表示不允许数据通过。

算数逻辑单元ALU

ALU是一种组合逻辑电路,实现了加/减/乘/除、与/或/非等功能。因此ALU是运算器的核心。

由于加减乘除等运算都要基于“加法”来实现,因此加法器是ALU的核心。

image-20240322083603788

重点总结:

  • 如果ALU支持k种功能,则控制信号位数 m ≥ ⌈ log ⁡ 2 k ⌉ m \geq \lceil \log_2 k \rceil mlog2k
  • ALU的运算数、运算结果位数与计算机的机器字长相同
  • ZF/OF/SF/CF标志位,用于表示本次运算结果的特征
  • 标志信息送入PSW程序状态字寄存器(标志寄存器FR)

定点数的移位运算

移位:通过改变各个数码位和小数点的相对位置,从而改变各数码位的位权。可用移位运算实现乘法、除法。

算术移位

image-20240322084101533

计算机中的有符号数都是用补码表示的,对于有符号整数的移位操作应采用补码算术移位方式。规则如下:左移低位补0,若左移前后符号位不同,则发生溢出;右移高位补符号位,或低位舍弃的比特位为1,则会丢失精度。

:下文关于三种码的算数移位,酌情阅读:

  1. 原码的算数移位,符号位保持不变,仅对数值位进行移位。

右移,高位补0,低位舍弃。若舍弃的位=0,则相当于÷2;若舍弃的位≠0,则会丢失精度;

左移,低位补0,高位舍弃。若舍弃的位=0,则相当于×2;若舍弃的位≠0,则会出现严重误差。

  1. 反码的算数移位

正数的反码与原码相同,因此对正数反码的移位运算也和原码相同。

负数的反码数值位与原码相反,因此负数反码的移位运算规则为:右移,高位补1,低位舍弃;左移,低位补1,高位舍弃。

  1. 补码的算数移位

正数的补码与原码相同,因此对正数补码的移位运算也和原码相同。

负数补码=反码末位+1,导致反码最右边几个连续的1都因进位而变为0,直到进位碰到第一个0为止。

规律为负数补码中,最右边的1及其右边同原码。最右边的1的左边同反码,即右移(同反码),高位补1,低位舍弃;左移(同原码),低位补0,高位舍弃。

总结如下:

image-20240322084646864

逻辑移位

image-20240322084747508

逻辑右移:高位补0,低位舍弃。

逻辑左移:低位补0,高位舍弃。

可以把逻辑移位看作是对“无符号数”的算数移位。

循环移位

image-20240322084844677

不带进位位,用移出的位补上空缺;带进位位,移出的位放到进位位,原进位位补上空缺。

定点数的加减运算

补码的加减运算

[X+Y]补=[X]补+[Y]补;[X-Y]补=[X]补+[-Y]补

image-20240322085831820

对于补码来说,无论加法还是减法,最后都变成加法,由加法器实现运算,符号位也参与运算

若最终结果位数大于n+1位,则高位丢弃,只保留n+1位。

溢出判断

image-20240322085901127

只有“正数+正数”才会上溢——正+正=负;只有“负数+负数”才会下溢——负+负=正。

补码定点数加减运算的溢出判断有三种方法:

  1. 方法一:采用一位符号位,A的符号位为 A s A_s As,B的符号位为 B s B_s Bs,运算结果的符号位为 S s S_s Ss。溢出逻辑表达式为 V = A s B s S s ‾ + A s B s ‾ S s V=A_sB_s \overline{S_s}+\overline{A_sB_s}S_s V=AsBsSs+AsBsSs,若V=0表示无溢出;若V=1表示有溢出。

即,参加操作的两个数符号相同,结果又与原操作数的符号不同,则表示结果溢出。

  1. 方法二:采用一位符号位,根据数据位进位情况判断溢出,符号位的进位 C s C_s Cs,最高数值为的进位 C 1 C_1 C1。溢出逻辑表达式为 V = C s ⊕ C 1 V=C_s \oplus C_1 V=CsC1,若V=0表示无溢出;若V=1表示有溢出。

image-20240322090631436

即,最高位(符号位)的进位与次高位(最高数值位)的进位相同,说明无溢出,否则说明溢出。

  1. 方法三:采用双符号为,正数符号为00,负数符号为11,即两个符号位为 S s 1 , S s 2 S_{s1},S_{s2} Ss1Ss2。溢出逻辑表达式为 V = S s 1 ⊕ S s 2 V=S_{s1} \oplus S_{s2} V=Ss1Ss2,若V=0表示无溢出;若V=1表示有溢出。

image-20240322090913740

即,运算结果的两个符号位相同,表示未溢出,否则表示溢出。

:双符号位补码又称模4补码,实际存储时只存储1个符号位,运算时会复制一个符号位。单符号位补码又称模2补码(只有在ALU中采取双符号位)。

无符号数的加减运算

:在计算机内部,无符号数的加减法等同于补码进行加减法,只是最后对于结果的解释不一样。

无符号数的加法运算

从最低位开始,按位相加,并往更高位进位。

image-20240322162224916

无符号数的减法运算

  1. 被减数不变,减数全部按位取反,末位加1,减法变加法
  2. 从最低位开始,按位相加,并往更高位进位

image-20240322162409715

溢出判断

手算判断溢出的方法:n bit无符号整数表示范围 0 ∼ 2 n − 1 0 \sim 2^n-1 02n1,超过此范围则溢出。

计算机判断溢出的方法:

  • 无符号加法的溢出判断:最高位产生的进位=1时,发生溢出,否则未溢出。
  • 无符号数减法的溢出判断:减法变加法,最高位产生进位=0时,发生溢出,否则未溢出。

##原码的加减运算

加法运算

  1. 正+正=绝对值做加法,结果为正

  2. 负+负=绝对值做加法,结果为负

  3. 正+负=绝对值大的减绝对值小的,符号同绝对值大的数

  4. 负+正=绝对值大的减绝对值小的,符号同绝对值大的数

正+正和负+负可能会发生溢出。

减法运算

减数符号取反,转变为加法运算。

补码加减运算电路

image-20240322163003533

原码的乘法运算

手算乘法(二进制)

image-20240323080753898

原码一位乘法

例:设机器字长为n+1=5位(含1位符号位),[x]原= 1.1101,[y]原= 0.1011,采用原码一位乘法求x*y

计算过程中,符号位单独处理,符号位= x s ⊕ y s x_s \oplus y_s xsys,数值位取绝对值进行乘法运算。

需要使用运算器的ACC(累加器,存放乘积高位)、MQ(乘商寄存器,存放乘数、乘积低位)、X(通用的操作数寄存器,存放被乘数)

image-20240322164323997

实现方法:先加法再移位,重复n次。

  • 加法:当前为=1,则ACC加上被乘数;当前位=0,则ACC加上0
  • 移位:对ACC与MQ内的二进制数看作连续的一个二进制数,一起进行逻辑右移,高位补0,ACC低位移到MQ(留在ACC的部分+此部分可称为“部分积”),而MQ的移出的低位则直接丢弃。

重复n次后,得到如下结果:

image-20240322165407027

最后,修改小数点前的符号位为1,计算完毕。

原码一位乘法手算模拟

设机器字长为5位(含1位符号位,n=4),x = −0.1101,y = +0.1011,采用原码一位乘法求x*y

解答过程如下:

image-20240322165708908

  • 乘数的符号位不参与运算,可以省略
  • 原码一位乘可以只用单符号位
  • 答题时最终结果最好写为原码机器数

最后计算符号位,得x*y=-0.10001111

补码的乘法运算

补码一位乘法

补码一位乘法也叫做Booth算法。一般来说,Booth算法的被乘数、部分积采用双符号位补码。

对比原码一位乘法

原码一位乘法补码一位乘法
进行n轮加法、移位进行n轮加法、移位,最后再来一次加法,加[X]补
每次加法可能+0、+[|X|]原(根据MQ的最低位)每次加法可能+0、+[X]补、+[-X]补(根据MQ的最低位、辅助位)
每次移位是逻辑右移每次移位是补码的算数右移
符号位不参与运算符号位参与运算
MQ最低位=1,(ACC)+[|X|]原;
MQ最低为=0,(ACC)+0
辅助位-MQ最低位=1,(ACC)+[X]补
辅助位-MQ最低位=0,(ACC)+0
辅助位-MQ最低位=-1,(ACC)+[-X]补

例:设机器字长为5位(含1位符号位,n=4),x = −0.1101,y = +0.1011,采用Booth算法求x·y。[x]补=1.0011,[−x]补=0.1101,[y]补=0.1011

image-20240323082056334

补码一位乘法手算模拟

image-20240323082509202

原码的除法运算

手算除法(二进制)

image-20240323083822744

规律:忽略小数点,每确定一位商,进行一次减法,得到4位余数,在余数末尾补0,再确定下一位商。确定5位商即可停止(机器字长为5位),得x/y结果为0.1101,余数为0.00000111

原码除法:恢复余数法

例:设机器字长为5位(含1位符号位,n=4),x=0.1011,y=0.1101,采用原码恢复余数法求x/y。|x|=0.1011,|y|=0.1101,[|y|]补=0.1101,[−|y|]补=1.0011

image-20240323084606990

实现方法:上商0/1,得到余数,余数末尾补0

  1. 计算机默认先商1,如果ACC中求余数,即(ACC)+ [−|y|]补,如果得到一个负数结果,则将当前商1变成商0,恢复余数。
  2. 将ACC、MQ整体逻辑左移,ACC高位丢弃,MQ低位补0

经过n+1次上商,n次左移操作,最终状态如下:

image-20240323085138844

原码除法:恢复余数法手算

符号位与数值位分开处理

image-20240323085314101

若余数为负,恢复余数时,则可直接商0,并让余数左移1位再加上|除数|

原码除法:加减交替法

符号位与数值位分开处理

image-20240323085913711

补码除法的运算

补码除法:加减交替法

设机器字长为5位(含1位符号位,n=4),x=+0.1000,y=-0.1011,采用补码加减交替除法求x/y。[x]补=00.1000,[y]补=11.0101,[−y]补=00.1011

image-20240323090105618

  • 符号位参与运算
  • 被除数/余数、除数采用双符号位

被除数和除数同号,则被除数减去除数;异号则被除数加上除数。

余数和除数同号,商1,余数左移一位减去除数;余数和除数异号,商0,余数左移一位加上除数,重复n次。

除法运算总结

image-20240323090651790

浮点数的表示和运算

浮点数的表示

image-20240325124159545

阶码E:常用补码或移码表示的定点整数,反映浮点数的表示范围及小数点的实际位置。

尾数M:常用原码或补码表示的定点小数,数值部分的位数n反映浮点数的精度。

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

r r r是浮点数的进制,决定了阶码的权重,基数越大,范围越大,但在浮点数的总位数不变的情况下比低基数的精度低。

尾数给出一个小数,阶码指明了小数点要向前/向后移动几位。

image-20240325124728632

浮点数的溢出

image-20240413211626857

运算结果大于最大正数时称为正上溢,小于绝对值最大负数时称为负上溢,正上溢和负上溢统称上溢。数据一旦产生上溢,计算机必须中断运算操作,进行溢出处理。

当运算结果在0至最小正数之间时称为正下溢,在0至绝对值最小负数之间时称为负下溢,正下溢和负下溢统称下溢。数据下溢时,浮点数值趋于零,计算机将其当作机器零处理。

浮点数尾数的规格化

规格化浮点数:规定尾数的最高数值位必须时一个有效值(tips:做题时注意尾数是原码还是补码)。

规格化的目的:主要是为了增加数据的表示精度。

左规:当运算结果的尾数最高数位不是有效位,需要进行左规,尾数左移一位,阶码减1(左规可能要进行多次)。

右规:当运算结果的尾数有效位进到小数点前面时,需要进行右规,右规只需要进行一次,将尾数右移一位,阶码加1(可能会导致溢出)。

image-20240325125252487

:采用双符号位,发生溢出时,更高的符号位是正确的符号位。

特点:规格化的原码尾数,最高数值位一定是1;规格化的补码尾数,符号位与最高数值位一定相反。

image-20240325130026166

IEEE754标准

image-20240325130211129

IEEE754标准规定用移码表示阶码,用原码表示尾数。

不同的数据类型有不同的位数,具体如下:

image-20240325130336820

:阶码全1、全0用做特殊用途。

阶码真值=移码-偏移量

  • 规格化的短浮点数的真值为: ( − 1 ) s ∗ 1. M ∗ 2 E − 127 (-1)^s*1.M*2^{E-127} (1)s1.M2E127

  • 规格化的长浮点数的真值为: ( − 1 ) s ∗ 1. M ∗ 2 E − 1023 (-1)^s*1.M*2^{E-1023} (1)s1.M2E1023

:将十进制数-0.75转换为IEEE 754的单精度浮点数格式表示。

image-20240325130722059

对于给定的小数,先转化成二进制数,确定符号位,对尾数进行规格化,确定阶码真值,规格化后的尾数即为浮点数格式的尾数(可能需要扩展),阶码真值加上偏移量即为浮点数格式的阶码(可能需要扩展),加上符号位,即可得出结果。

:IEEE 754的单精度浮点数C0 A0 00 00 H的值时多少。

image-20240325130746733

最小绝对值:尾数全为0,阶码真值最小-126,对应移码机器数0000 0001,此时整体的真值为 ( 1.0 ) 2 ∗ 2 − 126 (1.0)_2*2^{-126} (1.0)22126
最大绝对值:尾数全为1,阶码真值最大127,对应移码机器数1111 1110,此时整体的真值为 ( 1.111 … 11 ) 2 × 2 127 (1.111…11)_2×2^{127} (1.11111)2×2127

image-20240325131000800

  1. 当阶码E全为0,尾数M不全为0时,表示非规格化小数 ± ( 0. x x . . . x ) 2 ∗ 2 − 126 \pm (0.xx...x)_2*2^{-126} ±(0.xx...x)22126,此时隐含最高位变为0,阶码真值固定视为-126。
  2. 当阶码E全为0,尾数M全为0时,表示真值±0
  3. 当阶码E全为1,尾数M全为0时,表示无穷大±∞
  4. 当阶码E全为1,尾数M不全为0时,表示非数值“NaN” (Not a Number),非法运算

浮点数加减运算

浮点数加减运算步骤:

  1. 对阶
  2. 尾数加减
  3. 规格化
  4. 舍入
  5. 判溢出

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

image-20240325131630626

具体步骤如下:

image-20240325131647816

舍入问题

舍入是浮点数的概念,定点数没有舍入的概念。浮点数舍入的情况有两种,对阶和右规格化。舍入不一定产生误差。

  1. 就近舍入法:类似于十进制数运算中的“四舍五入”法,即在尾数右移时,被移去的最高数值位为0,则舍去;被移去的最高数值位为1,则在尾数的末位加1。这样做可能会使尾数又溢出,此时需再做一次右规。
  2. 恒置“1”法:尾数右移时,不论丢掉的最高数值位是“1”还是“0”,都使右移后的尾数末位恒置“1”。这种方法同样有使尾数变大和变小的两种可能。
  3. 正向舍入:朝数轴正无穷大方向舍入,如果是正数,不全为0时进1,全为0时截断;如果是负数,直接截断。
  4. 负向舍入:朝数轴负无穷大方向舍入,如果是正数,直接截断;如果是负数,不全为0时进1,全为0时截断。
  5. 截断法:截取所需位数,丢弃后面所有位。

C语言中浮点数类型

image-20240325131821798

c h a r → i n t → l o n g → d o u l e 和 f l o a t → d o u l e char \rightarrow int \rightarrow long \rightarrow doule 和 float \rightarrow doule charintlongdoulefloatdoule,范围、从小到大,转换过程没有损失。

$int \rightarrow float ,可能会损失精度, ,可能会损失精度, ,可能会损失精度,flaot \rightarrow int $,可能会溢出及损失精度

image-20240325132105471

:当高类型和低类型一起运算时,需将较低类型转化为高类型。

数据的存储和排列

大小端模式

image-20240325123151684

多个字节数据在内存里一定是占连续的几个字节。

image-20240325123232114

大端方式是高字节存放到内存的低地址,便于人类阅读;小端方式是低字节存放到内存的低地址,便于机器处理。

边界对齐

现代计算机通常是按字节编址,即每个字节对应1个地址。

通常也支持按字、按半字、按字节寻址。

假设存储字长为32位,则1个字=32bit,半字=16bit。每次访存只能读/写1个字。

image-20240325123751628

不同的寻址方式:

  1. 按Word:那必然就是0、4、8…
  2. 按1/2Word:那必然是0,2, 4, 6, 8…
  3. 按1Byte:那必然是0、1、2、3、4、5…
  4. 按双字:那就是0、8、6…
  • 17
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值