一、数制与编码
1. 进位计数制及其转换
(1)采用二进制编码的原因
- 二进制只有两种状态,使用物理器件制作成本低(2018)
- “1”与“0”正好与逻辑中的真假对应,方便实现逻辑运算(2018)
- 二进制的编码和运算简单,方便实现算术运算(2018)
(2)不同进制间的相互转换
二进制转换为八进制
二进制转换为十六进制
十进制转换为二进制(不直接考但会间接用到)
(3)真值与机器数
真值
机器数
- 用“0”和“1”表示正负的数值为机器数,机器中使用的数
2. BCD码
3. 定点数的编码表示
机器数的定点表示

表示法 | 定义 |
---|
原码 | 最高位表示数的符号,其余位表示数值 |
补码 | 正数的补码是本身,负数的补码是符号位不变,其它各位取反后末位+1 |
反码 | 正数的反码是本身,负数的反码是符号位不变,其它各位取反 |
移码 | 只能表示整数,把补码的符号位取反便是移码,方便比较大小 |
请注意,移码通常用于浮点数的指数部分,以便于进行数值大小的比较。在移码表示法中,所有的非负数(包括零)的表示都是唯一的,并且数值越大,其移码表示也越大,这使得比较操作变得简单。
(假设字长n+1位)


4. 整数的表示
(1)无符号整数
- 无符号整数常用来表示内存地址
- 无符号数和带符号数相互转换,存储的数值不变,只是解释方式变了(2019)
- 表达式中存在无符号数和有符号数时,所有数都转换为无符号数类型(数值不变,解释方法变了)
- unsigned int 比 int所表示的正数的范围广,经常考察int溢出而unsigned int 不溢出的情况
- 四则运算
- 无符号数加法:X+Y=X+Y然后左边溢出的位数都扔掉
- 无符号数减法:X-Y=X+【-Y】补
- 乘除法:简单的移位运算,有些数据该丢掉就丢掉
- 无符号数-1=11111111
- 编程通常用a>b,而不用a-b>0(可能发生类型转换而出错)
(2)带符号整数
二、运算方法和运算电路
1. 运算电路
(1)标志寄存器
标志位名称 | 描述 |
---|
溢出标志位(OF) | 有符号数运算的结果发生溢出则为1(只针对有符号数)(2018) |
进位标志位(CF) | 无符号数运算向更高位进位或借位则为1(只针对无符号数)(2018) |
零标志位(ZF) | 执行结果为0则为1 |
符号标志位(SF) | 执行结果为负则为1(只针对有符号数) |
奇偶标志位(PF) | 执行结果最低八位中1的个数为偶数个则为1 |
调整标志位(AF) | 运算时最低半字节有进位或借位则为1 |
这些标志位是CPU状态寄存器的一部分,它们在执行算术和逻辑运算后由CPU自动设置,用于指示特定的运算结果状态,从而影响程序的执行流程,例如在条件分支指令中根据这些标志位的状态决定是否跳转。
(2)算数逻辑单元

(3)加法器
①一位全加器

②串行加法器

③并行加法器
串行进位的并行加法器

并行进位的并行加法器

④补码加减运算器

- 注意
- 无符号数加减法、补码加减法都可通过此电路实现
- Sub信号加法为0,减法为1
- CF=Sub异或Cout(2018)
2. 运算方法
(1)移位运算
算术移位(2018)

逻辑移位(2018)
循环移位
- 分类
- 不带进位位CF
- 类似逻辑移位,CF不参与其中,但移位产生的副本会送进CF
- 带进位位CF
注意指向CF的箭头

(2)加减运算
- 溢出判断
- 一位符号位
- 符号位和最高数位,同时进位不进位或同时不进位不溢出,否则溢出(2010、2014、2018)
- 双符号位
- 特点
- 具有模2补码全部优点且更易检查加减运算中的溢出问题(不能解决溢出问题)
- 存储时只需要存一个符号位,只在ALU中运算时采用双符号位
- 结论
- 00:正数无溢出
- 11,负数无溢出
- 01,结果正溢出
- 10,结果负溢出
(3)乘除运算
乘法类型 | 描述 |
---|
原码一位乘 | 累加次数n,右移次数n,符号位不参与运算 |
补码一位乘 | 累加次数n+1,右移次数n,符号位参与运算 |
在原码一位乘中,由于符号位不参与运算,所以需要额外的步骤来处理符号位,以确保结果的正确性。而在补码一位乘中,符号位的处理更加自然,因为它可以像其他位一样参与运算,这使得补码在计算机中的运算更加普遍。
运算方法 | 描述 |
---|
原码加减交替法 | 加减次数n+1或n+2,左移次数n,符号位不参与运算 |
原码恢复余数法 | |
补码加减交替法 | 加减次数n+1,左移次数n,符号位参与运算 |
(4)类型转换
类型 | 描述 |
---|
无符号数<–>有符号数 | 数字不变,只不过解释方法变了(2012、2016、2019) |
长–>短 | 低位留着,高位截断 |
短–>长 | 即符号扩展,数值不会发生变化 |
例子:
- char(1B)–>short(2B)–>int(4B)–>long(4B)–>float(4B)–>double(8B)
- 215=32768;216=65536(2012、2016默认记住)
- int–>float可能影响精度(int数值在2^24范围内,float能精确表示,超过后可能不能精确表示)
- float–>int可能影响精度(比如float含小数时转换过程中小数部分丢失),也可能会溢出(float表示范围远大于int)
- int–>double一定不会出现精度丢失
- undesignd(无符号数):在运算时按照int型运算,在读取时按照无符号数
(5)符号扩展
- 正数
- 负数
- 原码:添0
- 反码:添1
- 补码:整数添1;小数添0(2009)
(6)数据存储和排列
①基本概念
- 对于一个数:10 23 45H
- LSB(最低有效字节):45
- MSB(最高有效字节):10
②存储方式
大端方式:数据从高位到低位存储,即在一个多字节的数字中,最有效位(最高位)存储在最小的内存地址处。小端方式:数据从低位到高位存储,即在一个多字节的数字中,最有效位(最高位)存储在最大的内存地址处。大端小端方式考察频率非常高,一定要掌握!!
存储方式 | 描述 |
---|
大端方式 | 数据从高位到低位存储(符合习惯)(2020) |
小端方式 | 数据从低位到高位存储(反人类法)(经常考) |

③边界对齐方式(2012、2020)
- 32位计算机按字编址,1字等于4B
- 字节随意存,半字地址是2整数倍,字地址是4整数倍,双字地址是8整数倍

三、浮点数表示与运算
1. 浮点数的表示
(1)浮点数的表示格式

(2)浮点数的表示范围
- 正上溢和负上溢都是上溢,正下溢和负下溢都是下溢

- 尾数决定精度,阶码决定范围
(3)浮点数的规格化
表示法 | 规格化方式 |
---|
基为2 | 原码规格化:0.1……/1.1……(尾数最高位一定是1) |
| 补码规格化:0.1……/1.0……(尾数最高位和尾数符号位相反) |
基为4、8 | 原码规格化:尾数最高两位或三位不全为0 |
| 阶码基为8,则表示的真值为8^(二进制阶码的真值) |
(4)IEEE754标准
①图示
经常考察把存储的二进制数转换为真值(2011、2014、2020)

②尾数M
③阶码E
- 采用移码表示,即减去127或者1023
- 短浮点数阶码的表示范围为-126~127
④表示范围
计算表示的最值(最大正负数、最小正负数等)(2012、2018)

阶码 | 尾数 | 表示的值 |
---|
全0 | 全0 | 0 |
全0 | 非全0(非规格化小数) | 2^-126 * 0.xxxx(2018) |
全1 | 全0 | +∞(正无穷大)或 -∞(负无穷大) |
全1 | 非全0(非数值) | NaN(不是一个数,2012) |
2. 浮点数的加减运算
(1)对阶
- 小阶向大看阶齐,不会产生阶码溢出(2015)
- 右归时尾数右移,可能会舍掉有效位影响精度
(2)尾数求和
(3)规格化
(4)舎入
- 恒置1法
- 只要因移位而丢失的位中有1,就把尾数末位置1(原来是0或1,现在都置为1)
- 截断法
- 0舍1入法
- 被舍去的最高数值位为0则直接舍去,被舍去的最高数值位为1则尾数的末位加1
- 这样做可能使尾数又溢出,此时还需要做一次右归(2015)
(5)溢出判断
溢出判断方法
- 尾数的“溢出”不是溢出,规格化后,阶码的溢出才是真正的溢出(2015)
溢出处理方法
- 上溢:绝对值太大,会引起溢出中断
- 下溢:绝对值太小,按0处理,一般不需要溢出中断
溢出类型 | 处理方法 |
---|
上溢 | 绝对值太大,会引起溢出中断 |
下溢 | 当绝对值太小,按0处理,一般不需要溢出中断 |
四、习题
- 十六进制的数相加,直接按位相加,逢16进1即可
- 十进制转为八进制,可以先转为二进制再转为八进制
- 很多十进制小数都不能由二进制精确表示,如1.3
- ALU属于组合逻辑电路
逻辑电路类型 | 描述 | 常见电路 |
---|
组合逻辑电路 | 任意时刻的输出只与当前时刻的输入有关 | 多路选择器、编码器、译码器、比较器 |
时序逻辑电路 | 任意时刻的输出与当前时刻以及历史状态有关 | 锁存器、触发器 |
- 影响串行进位的并行加法器运算速度的关键因素是进位传递延迟
- 定点数运算不存在舎入,舎入不一定会产生误差