第2章 数据的表示和运算
第2章 数据的表示和运算¶
最繁杂也最容易失分的一章。统考固定套路:拿 C 语言的 unsigned/short/int/float/double 出题,考表示范围、运算规则、溢出判断、类型转换,再加 IEEE 754 的表示与加减。这章不能只记结论,必须动手算。
b_25_3【知识树】第2章骨架¶
- 数制与编码
- 进制转换:除基取余(整数)、乘基取整(小数)
- 四种码制:原码 / 反码 / 补码 / 移码
- C 语言类型转换:截断 / 零扩展 / 符号扩展
- 运算电路
- 全加器 → 串行进位 → 并行(先行)进位
- 带标志加法器:OF / SF / ZF / CF
- ALU
- 定点运算
- 移位:逻辑移位 vs 算术移位
- 加减:补码统一为加法
- 溢出判断三法
- 乘除运算原理与电路
- 浮点数
- IEEE 754 格式与阶码偏置
- 特殊值:±0 / ±∞ / NaN / 非规格化数
- 浮点加减五步:对阶 → 尾数运算 → 规格化 → 舍入 → 溢出判断
- 数据存储
- 大端 vs 小端
- 边界对齐与结构体大小
b_25_02.1 数制与编码¶
计算机为什么用二进制? ★1考¶
- 物理实现容易:只需两种稳定状态的器件(高/低电平),成本低
- 可直接支持逻辑运算:1 和 0 恰好对应逻辑"真"与"假"
- 运算规则极简:用基本逻辑门就能高效实现算术和逻辑操作
★ 考过 2018
b_25_9十进制转二进制,整数部分怎么做?¶
除基取余:不断除以 2 记余数,直到商为 0。
⚠️ 最先得到的余数是最低位,所以要从下往上读。
b_27_1;PDF 第 27 页 · b_27_13十进制转二进制,小数部分怎么做? ★2考¶
乘基取整:不断乘以 2 记录整数部分,直到小数部分为 0 或达到所需精度。
⚠️ 最先得到的整数是最高位,从上往下读 —— 和整数部分方向相反,最容易记反。
★ 考过 2021、2022
💡 记忆法:"除下乘上" —— 除基取余从下往上读,乘基取整从上往下读。
b_27_0哪些十进制小数能被二进制精确表示?¶
当且仅当它能写成 k / 2ⁿ 的形式。
例:0.3 = 3/10,分母含质因数 5,无法用有限位二进制精确表示。反过来,任何有限位二进制小数都对应分母为 2 的幂的分数,总能精确转成十进制。
⚠️ 这条是浮点数误差题的根源。
b_27_13原码的定义和范围?¶
- 最高位是符号(0 正 1 负),其余各位是绝对值
- n+1 位原码范围:−(2ⁿ−1) ~ 2ⁿ−1,关于原点对称
- 零有两种表示:+0 和 −0
优点是与真值对应直观、乘除简便;缺点是零不唯一、加减复杂。
b_28_11补码的定义和范围? ★4考¶
- 正数补码 = 原码;负数补码 = 原码数值位按位取反、末位加 1
- n+1 位补码范围:−2ⁿ ~ 2ⁿ−1,比原码多表示一个 −2ⁿ
- 零的表示唯一(全 0)
★ 考过 2010、2013、2014、2022
💡 记忆法:负数补码 = "取反加一";范围口诀 "负的多一个" —— 补码比原码多表示一个最小负数。
b_28_24补码的四个特殊值分别长什么样?¶
[+0]补 = [−0]补 =全 0[−1]补 =全 1- 最大正整数 =
0,11…1 - 最小负整数 =
1,00…0(符号位 1、数值位全 0)
b_29_0补码怎么转真值? ★2考¶
- 符号位为 0 → 直接读作正数
- 符号位为 1:
- 一般可对整个补码按位取反、末位加 1,得到绝对值后加负号
- ⚠️ 特例“100…0”表示补码的最小负数 −2ⁿ(若总位数为 n+1);它没有同位宽的正数绝对值,不能把“只处理数值位”机械套到底
更稳的统一方法是按位权直接读:若总位数为 w,补码真值为 −x₍w−1₎·2^(w−1) + Σxᵢ·2ⁱ。这样“100…0”会直接得到 −2^(w−1)。
★ 考过 2020、2023
b_29_7移码怎么定义?和补码什么关系?¶
- 定义:[x]移 = 2ⁿ + x(真值加偏置值,数轴整体右移)
- 移码 = 补码的符号位取反 —— 这条最好用
- 零的表示唯一,范围与补码相同
💡 记忆法:"移码 = 补码翻符号" —— 只把补码最高位取反即可。
b_29_17移码为什么专门用于浮点数阶码?¶
因为移码保持真值的大小顺序 —— 移码值越大真值越大,所以比较阶码时可以直接按无符号数比大小,对阶的硬件实现最简单。
b_29_27移码的偏置值到底是多少?(两套别混)¶
- 一般 n+1 位移码:偏置值 2ⁿ
- IEEE 754 中 k 位阶码:偏置值 2^(k−1) − 1
⚠️ 所以 IEEE 754 单精度 8 位阶码的偏置是 127,不是 128。
💡 记忆法:IEEE 754 的偏置是 "2 的幂减一"(2⁷−1 = 127),一般移码才是整的 2ⁿ。
b_29_21负数的补码能直接比大小吗? ★1考¶
不能像原码那样直观看。但有个可用结论:在同为负数的前提下,补码(或反码)的数值部分越大,真值也越大。
另外:正数的原码、反码、补码三者相同(移码不同)。
★ 考过 2015
b_29_29【做题模板】同一位串换解释时,怎样一次算对?¶
不要先背“正着比/反着比”,先把位串按所需类型写成位权:
- 无符号解释:\(U=\sum_{i=0}^{w-1}x_i2^i\)。
- \(w\) 位补码解释:\(T=-x_{w-1}2^{w-1}+\sum_{i=0}^{w-2}x_i2^i\)。
- 扩展:无符号数补 0;补码有符号数复制符号位。
- 截断:只保留低 \(w\) 位,相当于模 \(2^w\);再按目标类型重新解释。
- 比较:先确认“有符号还是无符号”,再比较对应真值;同一串比特在两种解释下的大小关系可能完全不同。
这套方法可以统一处理类型转换、零/符号扩展、截断和 CF/OF 题;尤其能直接看出 100…0 的补码真值是 \(-2^{w-1}\)。
b_29_29;PDF 第 29 页 · b_29_30反码为什么基本不用?¶
- 零的表示不唯一(有 ±0)
- 表示范围与原码相同,比补码少一个最小负数 −2ⁿ
它只是原码转补码的中间形态:负数反码 = 原码数值位按位取反(末位不加 1)。
b_29_132.2 C 语言中的整数与类型转换¶
8 位有符号和无符号的范围各是多少? ★3考¶
- 无符号:0000 0000 ~ 1111 1111 → 0 ~ 255(0 ~ 2⁸−1)
- 有符号(补码):1000 0000 ~ 0111 1111 → −128 ~ 127(−2⁷ ~ 2⁷−1)
推广:n 位有符号补码范围 −2ⁿ⁻¹ ~ 2ⁿ⁻¹−1。
★ 考过 2017、2019、2024
b_30_14长类型转短类型会发生什么?¶
位截断:直接丢弃高位、保留低位。
⚠️ 这不是运算溢出,而是位截断引起的语义变化,而且不触发任何异常或错误报告,隐蔽性极强。 例:int 165537 转 short 得 −31071。
b_31_5相同字长的有符号↔无符号转换会发生什么?¶
二进制位模式完全不变,只改变解释方式。
例:short −4321 转 unsigned short 得 61215,两者的 16 个二进制位一模一样,只是一个按补码解释、一个按无符号解释。
b_31_12短类型转长类型补什么? ★3考¶
看源数据的符号性,不是看目标类型: - 源数据是无符号数 → 零扩展(高位补 0) - 源数据是有符号数 → 符号扩展(高位重复填符号位)
★ 考过 2012、2021、2024
b_31_02.3 运算电路¶
一位全加器的两个表达式?¶
- 和:Sᵢ = Aᵢ ⊕ Bᵢ ⊕ Cᵢ₋₁(三者中有奇数个 1 则为 1)
- 进位:Cᵢ = AᵢBᵢ + (Aᵢ ⊕ Bᵢ)Cᵢ₋₁
三输入:加数 Aᵢ、加数 Bᵢ、低位进位 Cᵢ₋₁;两输出:本位和 Sᵢ、向高位进位 Cᵢ。
b_38_1;PDF 第 38 页 · b_38_5串行进位和并行进位加法器差在哪?¶
- 串行进位(行波进位):n 个全加器级联,进位逐级传递。总延迟取决于进位从最低位传到最高位的时间,位数越多越慢
- 并行进位(先行进位 CLA):用先行进位逻辑部件几乎同时生成所有进位。位数大时明显更快,代价是电路复杂度上升
b_38_14四个标志位分别怎么产生?¶
- OF = Cₙ ⊕ Cₙ₋₁(最高位进位输出 ⊕ 进位输入)
- SF = Fₙ₋₁(结果的最高有效位)
- ZF:结果所有位为 0 时置 1
- CF = Sub ⊕ Cout
b_39_2;PDF 第 39 页 · b_39_4四个标志位各对谁有意义? ★5考¶
- ZF:对有符号数和无符号数都有意义
- OF、SF:仅对有符号数有意义
- CF:仅对无符号数有意义
⚠️ 反例题眼:无符号加法 010 + 011 = 101,虽然 OF = 1,但无符号运算并没有溢出。
★ 考过 2011、2018、2022、2023、2024
💡 记忆法:"有符号看 OF/SF,无符号看 CF,ZF 通吃" —— C 是 Carry(进位,无符号才有借进位的说法),O 是 Overflow(补码才谈溢出)。
b_42_212.4 移位与加减运算¶
逻辑移位的规则? ★1考¶
把操作数当无符号数: - 左移:高位移出、低位补 0;若移出的高位是 1 则溢出 - 右移:低位移出、高位补 0
★ 考过 2018
💡 记忆法:"逻辑一律补零"。
b_40_8算术移位的规则? ★3考¶
把操作数当有符号数(补码): - 左移:低位补 0;若移位后符号位改变则溢出 - 右移:高位补符号位;低位移出 1 会影响精度
例:4 位补码 1001(−7) 左移变 0010,符号由负变正 → 溢出;右移变 1100(−4),保住符号但丢精度。
★ 考过 2012、2017、2018
💡 记忆法:"算术右移补符号,左移变号就溢出"。
b_40_12补码加减运算的两个公式? ★4考¶
[A+B]补 = [A]补 + [B]补(mod 2ⁿ⁺¹)[A−B]补 = [A]补 + [−B]补(mod 2ⁿ⁺¹)
★ 考过 2009、2011、2017、2025
b_40_17补码为什么能把减法变成加法?¶
靠模运算:M − [B]补 = [−B]补,所以减 B 等价于加 (−B) 的补码。
配套的三条运算特点: - 符号位与数值位一同参与运算,结果符号位自然得出 - 按二进制规则逢二进一 - 结果自动截断为 n+1 位,高位进位直接丢弃,结果仍是补码
b_29_4;PDF 第 29 页 · b_29_52.5 溢出判断¶
补码溢出只可能发生在什么情况下?¶
同号相加,或异号相减。 具体表现为:两个正数相加结果为负,或一个负数减去一个正数结果为正。
b_41_5溢出判别法一:一位符号位法¶
两个操作数符号相同、而运算结果符号与之不同 → 溢出。
逻辑式:V = AₛBₛ·S̄ₛ + Āₛ·B̄ₛ·Sₛ
b_41_7;PDF 第 41 页 · b_41_10溢出判别法二:进位法(最常用) ★6考¶
V = Cₙ ⊕ Cₙ₋₁
即符号位产生的进位与最高数值位产生的进位不同就溢出。
★ 考过 2010、2011、2014、2018、2021、2025
b_41_10溢出判别法三:双符号位法(变形补码)¶
V = S₁ ⊕ S₂,两个符号位不同就溢出: - 00 → 结果为正,无溢出 - 01 → 正溢出 - 10 → 负溢出 - 11 → 结果为负,无溢出
⚠️ 记法:左符是真正的符号,右符用来判溢出;01/10 这两个"符号打架"的才是溢出。
💡 记忆法:"两个符号打架就是溢出" —— 01 正溢(想成正得太大溢到 0 后面),10 负溢。
b_41_13一套加减电路怎么同时干加法和减法? ★1考¶
关键是控制信号 Sub 一信号两用:既选择 Y 走不走反相器,又充当加法器的最低位进位 Cin。 - 加法(Sub=0):MUX 选 Y 直通,Cin = 0,算 X + Y - 减法(Sub=1):MUX 选 Ȳ(按位取反),Cin = 1,算 X + Ȳ + 1,正好等于 X − Y
★ 考过 2011
b_41_18运算器知道自己算的是有符号数还是无符号数吗?¶
不知道。 运算器只认二进制串,"有符号/无符号"完全是解释方式的差别。
例:0 − 1 = 00…0 + 11…1 = 11…1
- 当有符号数看 → −1,结果正确
- 当无符号数看 → 2ⁿ−1,与数学结果不符
⚠️ 这是统考极爱考的易混点。
b_42_18CF 标志在加法和减法时含义一样吗? ★1考¶
按本书给定的加减电路与 CF 定义,二者含义不一样,但可以用一个式子统一:CF = Sub ⊕ Cout - 加法(Sub=0):CF = Cout,CF=1 表示有进位、发生上溢 - 减法(Sub=1):CF = Cout 取反,CF=1 表示有借位、不够减
★ 考过 2024
b_43_2无符号数怎么用标志位比大小?¶
执行 A − B 后,看 ZF 和 CF: - ZF = 1 → A = B - ZF = 0 且 CF = 0 → A > B - CF = 1 → A < B(有借位说明不够减)
💡 记忆法:"无符号看借位" —— 借位了(CF=1)说明不够减,A 更小。
b_43_4有符号数怎么用标志位比大小?¶
执行 A − B 后,看 ZF、OF、SF: - ZF = 1 → A = B - ZF = 0 且 OF = SF → A > B - ZF = 0 且 OF ≠ SF → A < B
💡 记忆法:"有符号看 OF 纠 SF" —— 没溢出时符号说了算,溢出了符号是反的,所以用 OF⊕SF。
b_43_10有符号数比大小为什么不能只看 SF?¶
因为溢出会把结果符号翻转: - 正减负溢出后结果显示为负(SF=1),但实际 A > B - 负减正溢出后结果显示为正(SF=0),但实际 A < B
所以必须用 OF 去"纠正"SF,判据才是 OF⊕SF。这是本章最容易做错的判断题。
b_43_17;PDF 第 43 页 · b_43_18【做题模板】溢出和大小比较,先选哪条判断轨?¶
先问题目要的是数学范围、有符号结果还是无符号结果:
- 手算轨:先算数学真值,再看是否超出当前位宽的表示范围;这是选择题最稳的总检查。
- 有符号溢出轨:用“同号相加结果异号”、双符号位,或 \(OF=C_n\oplus C_{n-1}\)。
- 无符号进借位轨:加法看最高位进位;按本书加减器定义,减法用 \(CF=Sub\oplus C_{out}\) 判借位。
- 比较轨:统一先做 \(A-B\);无符号看
ZF/CF,有符号看ZF与SF⊕OF。
⚠️ OF 只说明补码有符号结果是否越界,CF 只说明无符号进位/借位;二者不能互相替代。
b_41_5;PDF 第 43 页 · b_43_22.6 乘除运算¶
原码一位乘法怎么算? ★2考¶
- 符号位单独算:乘积符号 = 两乘数符号异或
- 数值位:取绝对值当无符号数相乘
- 迭代式:Pᵢ = (Pᵢ₋₁ + X × yᵢ) >> 1,从乘数最低位开始,做 n 次
⚠️ 部分积要用 2n 位寄存器保存以保证精度;这里的右移是逻辑右移,是位操作不是数学除法。
★ 考过 2020、2024
b_44_9无符号乘法器每轮做什么?¶
- 判断:看乘数寄存器 Y 的最低 1 位
- 为 1 → P ← P + X,进位存入 C
- 为 0 → 空操作
- 移位:C、P、Y 整体逻辑右移
- 计数器减 1,循环 n 次
结果放在寄存器对 [P:Y](P 高 32 位、Y 低 32 位)。
b_45_1Booth(补码)乘法器和无符号乘法器差在哪?¶
硬件结构几乎相同,区别只在控制逻辑和移位类型: - Y 最低位再附加一个辅助位 y₋₁(初始为 0),看两位组合 - 10 → P ← P − X - 01 → P ← P + X - 00 或 11 → 空操作 - 移位改成 P、Y、y₋₁ 整体算术右移
💡 记忆法:"一零减,零一加,相同不动" —— 看 y₀y₋₁ 两位,10 减 X、01 加 X、00/11 空操作。
b_46_3;PDF 第 46 页 · b_46_4无符号乘法怎么判溢出? ★2考¶
高 32 位 P ≠ 0 就是溢出。此时处理器把 OF 和 CF 同时置 1。
★ 考过 2019、2020
b_45_7有符号乘法怎么判溢出? ★1考¶
P 不是 Y 的符号扩展(即 P 的各位不全等于 Y 的符号位)就是溢出。同样把 OF 和 CF 置 1。
⚠️ 两种乘法的溢出处理都属于软件层面 —— 查标志位后决定插溢出自陷指令还是忽略。
★ 考过 2021
b_46_12乘法器的三种实现方式,速度成本怎么排?¶
- 迭代式乘法器:ALU + 移位器 + 寄存器 + 控制逻辑,每次处理一位,约需 2n 个时钟周期
- 阵列乘法器:全并行、所有部分积同时生成,时钟周期够长时可单周期完成,最快最贵
- 移位-加减法:如 ×13 拆成 X<<3 + X<<2 + X,成本最低、速度最慢
b_46_18除法运算前要做哪些预判? ★1考¶
- 被除数为 0 且除数不为 0,或 |被除数| < |除数| → 商 = 0,余数 = 被除数,不进入迭代
- 被除数不为 0、除数为 0 → 触发"除数为 0"异常
- 两者都为 0 → 除法错误异常
★ 考过 2025
b_47_1无符号除法每轮做什么?(恢复余数法) ★1考¶
n 位被除数要高位补 0 扩展成 2n 位,再除以 n 位除数。每轮: - 移位:R 与 Q 整体逻辑左移(Q 的最高位移入 R 的最低位) - 试商:算 R − Y - ≥ 0 → 商位为 1,差值写回 R - < 0 → 商位为 0,再执行 R + Y 恢复余数 - 计数器减 1,循环 n 次
★ 考过 2025
b_47_9两个 n 位无符号数相除会溢出吗?¶
不会。 被除数最大 2ⁿ−1,最小非零除数为 1,此时商最大也是 2ⁿ−1,恰好能用 n 位无符号数表示。
b_48_9补码除法唯一会商溢出的情形是什么?¶
被除数 = 最小负数 −2ⁿ⁻¹,且除数 = −1。 此时结果 2ⁿ⁻¹ 无法用 n 位补码表示。
b_48_21补码除法与原码/无符号除法的控制流程差在哪? ★1考¶
不能压缩成“唯一差别只是 R 的初值”: - 原码/无符号轨:符号另行处理;数值部分按余数正负决定恢复或不恢复,商位反映比较结果 - 补码轨:符号参加运算,R 先由被除数符号扩展;每轮还要根据当前余数与除数同号还是异号决定试商位及下一步做加法还是减法 - 移位采用保持补码符号语义的操作;最终余数符号应与被除数一致
⚠️ “末位恒置 1”等口诀只适用于教材给定的补码加减交替算法,不是所有硬件有符号除法器的通用定义。
★ 考过 2025
b_48_132.7 IEEE 754 浮点数¶
IEEE 754 单精度和双精度各字段多少位?¶
- 单精度 float(32 位):符号 1 + 阶码 8 + 尾数 23
- 双精度 double(64 位):符号 1 + 阶码 11 + 尾数 52
b_59_5规格化浮点数的真值公式?¶
- 单精度:(−1)ˢ × 1.f × 2^(e−127)
- 双精度:(−1)ˢ × 1.f × 2^(e−1023)
b_59_13什么是隐藏位?为什么单精度有 24 位有效数字?¶
规格化数的尾数最高位恒为 1,IEEE 754 不显式存储它,而是隐含在小数点之前,称为隐藏位。
所以:单精度 23 位尾数实际提供 24 位有效数字,双精度 52 位提供 53 位。
💡 记忆法:"省一位,多一位" —— 省下不存的那个 1,换来多一位有效精度(23→24)。
b_59_0规格化数的阶码取值范围是多少?¶
- 单精度:e = 1 ~ 254
- 双精度:e = 1 ~ 2046
⚠️ 全 0 和全 1 被保留用于表示特殊值,所以规格化数取不到。
b_59_17十进制实数转 IEEE 754 的五步? ★6考¶
以 −8.25 为例:
- ① 转二进制:−8.25 = −1000.01
- ② 规格化:= −1.00001 × 2³(小数点前必须是 1)
- ③ 尾数 f = 小数点后的位、补 0 到 23 位 → 00001000…0
- ④ 阶码 e = 真值 + 127 = 3 + 127 = 130 = 10000010
- ⑤ 拼装:1 | 10000010 | 00001000…0 = C1040000H
⚠️ 两个最常见错误:忘了加偏置、把隐藏的那个 1 也写进尾数。
★ 考过 2011、2013、2020、2022、2023、2025 —— 本章最高频
💡 记忆法:"转、规、补、偏、拼" —— 转二进制、规格化、尾数补 0、阶码加偏置、拼三段。
b_61_4IEEE 754 机器数怎么反推真值?¶
以 C6400000H 为例:
- 拆成 1 | 10001100 | 100 0000…
- 符号 = 1 → 负数
- 阶码真值 = 10001100 − 01111111 = 13
- 尾数真值 = 1 + 0.1 = 1.5(别忘了加回隐藏位 1)
- 结果:−1.5 × 2¹³
b_61_0阶码全 0 尾数全 0 表示什么?¶
±0,由符号位决定正负,通常 +0 和 −0 等效。
b_60_0阶码全 1 尾数全 0 表示什么?¶
±∞。+∞ 大于所有有限数,−∞ 小于所有有限数。引入它是为了让程序在溢出等异常时仍能继续执行。
b_61_1阶码全 1 尾数非 0 表示什么?¶
NaN(Not a Number),表示一个没有定义的数,如 0/0、∞−∞ 等无效运算的结果。
b_61_2阶码全 0 尾数非 0 表示什么?指数是多少? ★2考¶
非规格化数:不使用隐藏位,用于实现渐进下溢、填补 0 与最小规格化数之间的空隙。
⚠️ 其指数固定为 −126(双精度 −1022),不是 −127。
★ 考过 2017、2023
💡 记忆法:"非规格化不是 −127,是 −126" —— 阶码字段虽是全 0,但指数按最小规格化值 1−127 算。
b_60_14单精度浮点数的表示范围怎么推? ★3考¶
- 最小规格化正数:e=1, f=0 → 1.0 × 2^(1−127) = 2⁻¹²⁶
- 最大规格化正数:e=254, f 全 1 → 1.111…1 × 2^127 = 2¹²⁷ × (2 − 2⁻²³)
双精度同理:最小 2⁻¹⁰²²,最大 2¹⁰²³ × (2 − 2⁻⁵²)。
★ 考过 2017、2018、2024
b_60_1浮点数上溢怎么处理?¶
结果绝对值超过最大规格化数: - 置位浮点溢出异常标志 - 结果由符号和舍入方向共同决定:舍入到最近时通常得到相应符号的无穷;定向舍入时也可能饱和为该方向可表示的最大有限数
⚠️ 默认情况下不触发异常中断,程序继续执行,除非显式开启异常响应。
b_60_4;PDF 第 60 页 · b_60_5浮点数下溢怎么处理?(渐进下溢)¶
结果绝对值小于最小规格化正数但不为 0: - 若落在非规格化数可表示范围内 → 以非规格化形式存储,保留部分有效精度 - 若舍入后为零 → 存为 ±0,置位下溢标志
b_60_92.8 浮点加减运算¶
浮点加减的五个步骤是什么? ★1考¶
对阶 → 尾数加减 → 规格化 → 舍入 → 溢出判断
★ 考过 2009
b_61_19对阶为什么必须"小阶向大阶看齐"?¶
因为小阶向大阶看齐时是把阶码小的数的尾数右移,移出的是低位;
⚠️ 若反过来大阶向小阶看齐,就要左移尾数,会把最高有效位移出去,造成不可逆的精度错误。
右移位数 = 两阶码差的绝对值;移出的低位应保留参与后续运算,不能直接丢。
b_61_22;PDF 第 61 页 · b_61_23尾数加减前要做什么准备?¶
- 把隐藏位 1 还原回尾数,形成完整的 1.f 形式
- 对阶时为保持精度而保留的附加位也要参与加减运算
b_62_0;PDF 第 62 页 · b_62_1左规和右规分别在什么时候做?¶
- 右规:结果形如
1×.×××(进到两位)→ 尾数右移、阶码加 1,只需一次 - 左规:结果形如
0.0…01××→ 尾数左移、阶码减 1,可能要多次
记:左规一次相当于乘 2,右规一次相当于除 2。
💡 记忆法:"左规可多次,右规仅一次";左移阶减、右移阶加,"移哪边阶码往反方向走"。
b_62_2舍入用的三个辅助位是什么?¶
- 保护位:紧邻尾数最低有效位之后的第一位
- 舍入位:位于保护位之后
- 粘滞位:只要舍入位之后被移出的位中存在至少一个 1 就置 1
b_62_10;PDF 第 62 页 · b_62_11就近舍入(默认模式)的三条规则?¶
- 保护位 = 0 → 直接舍去
- 保护位 = 1 且(舍入位 = 1 或 粘滞位 = 1)→ 尾数加 1
- 保护位 = 1、舍入位 = 0、粘滞位 = 0(恰在正中间)→ 向偶数舍入,末位是奇数才加 1
另外三种模式:正向舍入(朝 +∞)、负向舍入(朝 −∞)、截断(朝原点)。
b_62_17浮点数的溢出到底由什么决定? ★1考¶
只由阶码决定。 尾数溢出可以靠右规修正,真正的溢出仅发生在阶码上溢或下溢时。 - 上溢:阶码已是最大规格化值(单精度 127),再加 1 变成全 1(被 ∞/NaN 占用) - 下溢:阶码降到最小规格化值(单精度 −126)以下,进入非规格化数范围;比最小非规格化数 2⁻¹⁴⁹ 还小则置为机器零
★ 考过 2015
b_63_2float 能靠左移一位实现乘 2 吗? ★1考¶
不能。 float 的位串由符号、阶码、尾数三段组成,整体左移会破坏字段边界(尾数最高位会挤进阶码)。乘 2 的正确做法是阶码加 1。
★ 考过 2017
b_61_212.9 C 语言类型转换与数据存储¶
int 转 float 会丢东西吗? ★1考¶
不会溢出,但可能丢精度。 float 有效位仅 24 位(含隐藏位),int 是 32 位,当整数的二进制有效位超过 24 位时要舍入。
★ 考过 2017
b_63_17double 转 float 有哪两个风险?¶
- 可能溢出:float 表示范围较小
- 可能舍入:float 尾数有效位更少
b_64_2float/double 转 int 会发生什么?¶
- 小数部分直接向零截断(不是四舍五入)
- 若截断后的值超出目标整数类型可表示范围,不能简单按“补码回绕”处理;C/C++ 语言规则、异常状态和目标 ISA 行为需分开,概念题按题目给定口径
b_64_3大端和小端怎么区分? ★6考¶
- 大端 big endian:MSB(最高有效字节)放低地址,字节顺序与十六进制书写顺序一致
- 小端 little endian:LSB(最低有效字节)放低地址,顺序与书写相反
int = 01234567H 存在 0800H 起: - 大端:0800H=01H, 0801H=23H, 0802H=45H, 0803H=67H - 小端:0800H=67H, 0801H=45H, 0802H=23H, 0803H=01H
★ 考过 2016、2018、2019、2023、2024、2025
💡 记忆法:"小端小在前" —— 小端把最低有效字节(小头)放在低地址。
b_64_12反汇编题里怎么判断大小端? ★2考¶
看机器码里立即数的字节排列。例:01 05 64 94 04 08 add eax, 0x08049464
- 立即数字节按地址递增为 64H、94H、04H、08H
- 低地址是 LSB(64H)→ 小端
- 阅读小端机器码时,要把连续字节逆序重组才能还原逻辑数值
★ 考过 2019、2023
b_64_16边界对齐的两条规则?¶
- 规则①:每个成员的起始地址必须是其对齐值的整数倍(char 为 1、short 为 2、int 为 4)
- 规则②:整个结构体的大小必须是最大成员对齐值的整数倍,不足则尾部填充
💡 记忆法:"各自对齐,整体凑整" —— 每个成员对齐到自己的倍数,整个结构体凑到最大成员的倍数。
b_65_11为什么成员顺序会改变结构体大小? ★2考¶
B 里 char 之后要填 3 字节给 int 让位(int 必须落在 4 的倍数地址),A 则没有这个浪费。
★ 考过 2012、2020
b_65_15为什么要边界对齐?代价是什么?¶
- 好处:对齐后 CPU 一次访存就能读到完整数据;否则数据跨越两个存储单元,需两次访存再拼接,效率显著降低
- 代价:编译器要填充空白字节,略微增加内存占用 —— 是典型的"以空间换时间"
RISC 普遍采用边界对齐,以支持高效的指令流水线。
b_65_4字长和字是一回事吗?¶
不是。 - 字长(机器字长):CPU 内部整数运算数据通路的宽度,通常等于通用寄存器宽度。"32 位机""64 位机"说的是它 - 字(word):体系结构层面的约定单位,长度因架构而异
反例:Intel x86 从 80386 起字长 32 位,但其体系结构仍规定 16 位为一个字,32 位叫双字。
b_64_6【易混点】第2章成对概念对照¶
| 易混对 | 分界线 |
|---|---|
| 原码 vs 补码范围 | 补码多一个最小负数 −2ⁿ,且零唯一 |
| 补码 vs 移码 | 只差符号位取反;移码保序,专用于阶码 |
| 一般移码偏置 vs IEEE 754 偏置 | 前者 2ⁿ;后者 2^(k−1)−1(8 位阶码是 127) |
| OF vs CF | OF 只对有符号数有意义,CF 只对无符号数有意义 |
| 逻辑移位 vs 算术移位 | 右移时逻辑补 0、算术补符号位 |
| 无符号比大小 vs 有符号比大小 | 前者看 ZF/CF,后者看 ZF/OF⊕SF |
| 左规 vs 右规 | 左规可能多次、阶码减;右规只需一次、阶码加 |
| 规格化数 vs 非规格化数 | 后者阶码全 0、无隐藏位、指数固定 −126 |
| 大端 vs 小端 | 大端 MSB 在低地址(与书写一致),小端 LSB 在低地址 |
| 字 vs 字长 | 字是架构约定,字长是硬件实际处理宽度 |
b_80_14【必背数字】第2章¶
- n+1 位补码范围 −2ⁿ ~ 2ⁿ−1;n 位补码 −2ⁿ⁻¹ ~ 2ⁿ⁻¹−1
- 8 位无符号 0~255;8 位有符号 −128~127
- 单精度:1+8+23,偏置 127,有效位 24,阶码 1~254
- 双精度:1+11+52,偏置 1023,有效位 53,阶码 1~2046
- 单精度最小规格化正数 2⁻¹²⁶,最大 2¹²⁷×(2−2⁻²³),最小非规格化数 2⁻¹⁴⁹
- 非规格化数指数:单精度 −126、双精度 −1022
- OF = Cₙ ⊕ Cₙ₋₁;CF = Sub ⊕ Cout
- 迭代乘法器耗时约 2n 个时钟周期
- 补码除法唯一商溢出:−2ⁿ⁻¹ ÷ (−1)
b_60_1;PDF 第 60 页 · b_60_2