数据的表示和运算

考点定位

  • 大纲章节:数制与编码、定点数表示与运算、浮点数表示与运算(IEEE 754)、算术逻辑单元
  • 常见题型:选择题密集(进制/校验码/范围/溢出/IEEE 754 互转),大题热点是 IEEE 754 表示与浮点运算流程
  • 考查频率:高(408 计组部分最高频的章节之一,几乎每年 4-6 分)
  • 工程师读者注意:你天天用补码和 float,但考试考手算全流程与教材口径的术语(左规/右规/对阶/溢出判断),坑全在细节

一、进制转换与编码

1.1 进制转换

整数部分除 2 取余(倒序),小数部分乘 2 取整(顺序)。工程师对整数转换无压力,重点是小数的精度陷阱。

小数转换的精度陷阱:多数十进制小数无法精确表示为有限位二进制。

例:0.6→0.6×2=1.20.6 \to 0.6\times2=1.2(取 1)→0.2×2=0.4\to 0.2\times2=0.4(取 0)→0.4×2=0.8\to 0.4\times2=0.8(取 0)→0.8×2=1.6\to 0.8\times2=1.6(取 1)→\to 回到 0.60.6,开始循环:0.6=0.1001 1001 …20.6 = 0.1001\,1001\,\dots_2,是无限循环小数。

选择题问法:"十进制 0.6 用二进制表示时是……"答:无限循环小数,无法精确表示。能精确表示的十进制小数分母须为 2 的幂(如 0.5、0.75、0.0625)。

转换链套路:十进制 ↔ 二进制 ↔ 十六进制。八进制/十六进制与二进制按 3 位/4 位一组直转,nn 位十六进制对应 4n4n 位二进制。

1.2 BCD 码(8421 码)

每 4 位二进制表示 1 位十进制数字。十进制 59 → 0101 1001。

加法修正规则:两位 BCD 相加若某组结果 > 1001(即 > 9)或产生进位,则该组 +0110(+6)修正。

例:BCD 计算 9+89+8:1001+1000=1 00011001+1000=1\,0001,低 4 位为 0001 且有进位,需修正:1 0001+0110=1 01111\,0001+0110=1\,0111,即 0001 0111 = 17。

陷阱:BCD 码中 1010~ 1111 六种组合非法;"8421 码是有权码、余 3 码是无权码"是常考对比。

1.3 字符编码(ASCII)与校验位

  • 7 位编码共 128 字符;数字 '0' = 30H,大写 'A' = 41H,小写 'a' = 61H(大小写相差 20H,即第 5 位不同)。
  • 数字字符的 ASCII 低 4 位即该数字的 BCD 码('5' = 35H)。

校验位计算:如 'A' = 1000001(7 位,含两个 1),配奇校验(使整个码字中 1 的个数为奇数)时校验位 = 1;配偶校验时校验位 = 0。考法常给一个字符让你算奇/偶校验位,或给含校验位的码判断是否出错。

二、校验码

2.1 奇偶校验

  • 添加 1 位使码字中 1 的个数为奇(奇校验)或偶(偶校验)。
  • 能力:检测 1 位(奇数位)错,不能纠错,不能检测偶数位错。
  • 码距(汉明距离)为 2。

2.2 码距与检错纠错能力(必背结论)

设码距为 dd:

  • 检测 ee 位错:d≥e+1d \ge e+1
  • 纠正 tt 位错:d≥2t+1d \ge 2t+1
  • 同时检 ee 纠 tt(e>te>t):d≥e+t+1d \ge e+t+1

典型:纠 1 位错需码距至少 3;检 2 位错需码距至少 3;检 1 纠 1 需码距至少 4?——注意口径:只纠 1 位错是 d≥3d\ge3;"同时检 2 并纠 1"需 d≥2+1+1=4d \ge 2+1+1 = 4。题目常在 3 和 4 之间挖坑,看清楚问的是"仅纠 1"还是"又检又纠"。

2.3 海明码(汉明码)

校验位位数确定:信息位 nn 位,校验位 kk 位,须满足

2k≥n+k+12^k \ge n+k+1

速查:n=4→k=3n=4 \to k=3(23=8≥82^3=8\ge8);n=8→k=4n=8 \to k=4(24=16≥132^4=16\ge13);n=16→k=5n=16 \to k=5。

分组规则:校验位放在 2i2^i 号位置(第 1、2、4、8…位),第 jj 号信息位由其二进制展开中含 2i2^i 的那些校验位覆盖(第 3 位 = 1+2,被 P1,P2P_1,P_2 覆盖;第 5 位 = 1+4;第 6 位 = 2+4;第 7 位 = 1+2+4)。

分步演示【待动画化】:信息位 1010,按偶校验海明编码,n=4,k=3n=4,k=3,码字 7 位:

  1. 布局:位置 3、5、6、7 放信息位(按约定次序)D3=1,D5=0,D6=1,D7=0D_3=1, D_5=0, D_6=1, D_7=0
  2. 求 P1P_1(覆盖 1、3、5、7 位):P1=1⊕0⊕0=1P_1 = 1 \oplus 0 \oplus 0 = 1
  3. 求 P2P_2(覆盖 2、3、6、7 位):P2=1⊕1⊕0=0P_2 = 1 \oplus 1 \oplus 0 = 0
  4. 求 P4P_4(覆盖 4、5、6、7 位):P4=0⊕1⊕0=1P_4 = 0 \oplus 1 \oplus 0 = 1
  5. 码字(第 1→7 位):1 0 1 1 0 1 01\,0\,1\,1\,0\,1\,0

纠错演示【待动画化】:接收方收到 1 0 1 1 1 1 01\,0\,1\,1\,1\,1\,0(第 5 位 0→1 出错):

  1. S1=S_1 = 第 1,3,5,7 位异或 =1⊕1⊕1⊕0=1= 1\oplus1\oplus1\oplus0 = 1
  2. S2=S_2 = 第 2,3,6,7 位异或 =0⊕1⊕1⊕0=0= 0\oplus1\oplus1\oplus0 = 0
  3. S4=S_4 = 第 4,5,6,7 位异或 =1⊕1⊕1⊕0=1= 1\oplus1\oplus1\oplus0 = 1
  4. 伴随式 S4S2S1=1012=5S_4S_2S_1 = 101_2 = 5,第 5 位出错,取反即纠正

能力结论:纠 1 位错或检(不纠)2 位错,标准海明码码距为 3;增设总体校验位后可"检 2 纠 1"( SEC-DED ,实际内存 ECC 的做法)。

2.4 循环冗余校验(CRC)

发送方:信息位左移 rr 位(rr = 生成多项式最高次数,即除数位数减 1),用模 2 除法(异或,不借位)除以生成多项式对应位串,余数即 FCS,拼接在信息位后。接收方用同一多项式除整个码字,余数非 0 即出错。

模 2 除法分步演示【待动画化】:信息位 1010,生成多项式 G(x)=x3+x+1G(x) = x^3+x+1,对应除数 1011,r=3r=3:

被除数 = 1010 后补 3 个 0 = 1010000。

步骤当前余数窗口商位异或对象结果
11010110110001,落下一位得 0010
20010000000010,落下一位得 0100
30100000000100,落下一位得 1000
41000110110011,位数用尽

余数 = 011,即 FCS。发送码字 = 1010 011。自检:1010011 ÷ 1011 余 0。

注意:模 2 除法每一位运算都是异或、不进位不借位;"当前窗口最高位是 0 就商 0、异或全 0"这一步最容易漏做导致错位。

三、定点数的表示

3.1 四种机器码对比(含 1 位符号、nn 位数值,以 8 位整数为例)

四种码都是把真值(带正负号的实际数值)编码为机器数,编码规则(严格定义):

  • 原码 [x]原[x]_原:符号位(0 正 1 负)+ 绝对值的二进制。如 x=−45x=-45(8 位):[x]原=1010 1101[x]_原 = 1010\,1101。
  • 反码 [x]反[x]_反:正数与原码相同;负数 = 符号位不变、数值位按位取反。
  • 补码 [x]补[x]_补:正数与原码相同;负数 = 其反码末位加 1。等价定义:[x]补=2n+x[x]_补 = 2^n + x(模 2n2^n 加上真值,做同余映射),这是补码能把减法统一为加法的原因。
  • 移码 [x]移[x]_移:[x]移=2n+x[x]_移 = 2^n + x(真值加偏置量 2n2^n),与补码数值位完全相同、仅符号位相反;移码的编码顺序与无符号数大小顺序一致,故用于浮点阶码的比较。
码制0 的表示表示范围(8 位)特点
原码两个(00000000 / 10000000)−(27−1)∼27−1-(2^7-1) \sim 2^7-1(-127~127)乘除方便,加减复杂
反码两个(00000000 / 11111111)−127∼127-127 \sim 127负数=按位取反,很少实用
补码唯一(00000000)−27∼27−1-2^7 \sim 2^7-1(-128~127)加减统一,多表示一个最小负数
移码唯一(10000000 表示 0)−128∼127-128 \sim 127用于浮点阶码,便于比较大小

一般化(整数,1 符号 + nn 数值):原码/反码 ±(2n−1)\pm(2^n-1);补码/移码 −2n∼2n−1-2^n \sim 2^n-1。

必背结论:

  • 补码与移码数值位完全相同,仅符号位相反:[x]移=[x]补[x]_移 = [x]_补 符号位取反。如 x=−1x=-1:[x]补=FFH[x]_补=FFH,[x]移=7FH[x]_移=7FH(8 位,偏置 27=1282^7=128,−1+128=127=0111 1111-1+128=127=0111\,1111)。
  • 由 [x]补[x]_补 快速求 [−x]补[-x]_补:连同符号位一起取反加 1。
  • 补码算术右移:符号位不变,数值位右移(相当于除以 2 向负无穷取整,−5≫1=−3-5 \gg 1 = -3)。
  • 真值 x 与补码的互推:负数 x=−(2n−数值位按位取反后加1的值)x = -(2^n - \text{数值位按位取反后加}1\text{的值}),考场速算用"取反加一加负号"。

3.2 补码加减与溢出判断

补码加法:符号位一起参与运算;减法转加法:[X−Y]补=[X]补+[−Y]补[X-Y]_补 = [X]_补 + [-Y]_补。

溢出判断三种方法(只有同号相加才可能溢出,异号相加必不溢出):

  1. 单符号位进位异或:溢出 = 符号位产生的进位 CsC_s ⊕ 最高数值位向符号位的进位 C1C_1。两者不同则溢出。
  2. 双符号位(变形补码):用两位符号位运算,结果符号位 00 正确(正)、11 正确(负)、01 正溢出、10 负溢出(第一符号位永远是正确符号)。
  3. 操作数与结果符号:同号操作数相加结果符号相反则溢出。

分步演示:8 位补码 86+4286 + 42:

  1. 86=0101 011086 = 0101\,0110,42=0010 101042 = 0010\,1010(均为正数)
  2. 相加:0101 0110+0010 1010=1000 00000101\,0110 + 0010\,1010 = 1000\,0000
  3. 结果符号位为 1 而操作数均为正 → 正溢出(真值 128 超出 −128∼127-128\sim127)
  4. 双符号位验算:00∣01010110+00∣00101010=01∣0000000000|01010110 + 00|00101010 = 01|00000000,符号 01 → 正溢出,一致

负溢出示例:−100+(−100)-100 + (-100):−100=1001 1100-100 = 1001\,1100,相加 =1 0011 1000= 1\,0011\,1000,丢进位得 0011 1000=560011\,1000 = 56,两负得正 → 负溢出;双符号位:11∣0011100+11∣0011100=10∣011100011|0011100 + 11|0011100 = 10|0111000,符号 10 → 负溢出。

快速判断技巧:先估算真值是否落在表示范围内,再套公式验证——比纯位级判断更稳。

3.3 乘除(了解即可)

原码一位乘、补码一位乘(Booth)、除法(恢复余数/加减交替)近年以选择考概念(部分积、符号处理)为主,大题概率低,掌握"Booth 算法根据相邻两位判断加减"即可。

3.4 符号扩展与位截断(选择题高频)

  • 原码扩展:符号位不动,数值位高位补 0。
  • 补码扩展:高位补符号位(正数补 0、负数补 1),值不变。速记:补码的"1 前缀"对负数是无数个符号位,截多长都不变值。
  • 截断(长 → 短):直接丢弃高位、保留低位,剩余位按新类型重新解释,值通常改变。

例:8 位 [x]补=1110 0010[x]_补 = 1110\,0010(真值 −30-30)扩展为 16 位:1111 1111 1110 00101111\,1111\,1110\,0010(= FFE2H,真值仍为 −30-30:65536−30=65506=FFE2H65536-30=65506=\text{FFE2H})。

考法:给 8 位补码问 16 位扩展后的十六进制;或问"[x]补=92H[x]_补 = 92H,将其作为 16 位数的低 8 位并符号扩展,高 8 位是多少"(92H 最高位 1 → 高 8 位 FFH)。

四、浮点数与 IEEE 754

4.0 浮点数的一般格式与规格化

IEEE 754 之前先建立一般模型:浮点数 = 阶码 + 尾数,即

N=M×rEN = M \times r^E

  • 阶码 EE:用定点整数表示(补码或移码),其位数决定表示范围;尾数 MM:用定点小数表示(补码或原码),其位数决定表示精度;rr 为基数(机器内常取 2)。
  • 规格化数:尾数最高数值位为有效数字的浮点数,目的是统一表示形式、保留最多有效位。判据:原码尾数 12≤∣M∣<1\frac{1}{2} \le |M| < 1(形如 0.1xx…0.1xx\ldots);补码尾数的符号位与最高数值位相反(正数 0.1xx…0.1xx\ldots,负数 1.0xx…1.0xx\ldots)——符号位与最高数值位相同(0.0xx0.0xx 或 1.1xx1.1xx)即为非规格化,需左规(见 4.4)。
  • IEEE 754 用隐含最高位 1 强制尾数规格化,并保留阶码全 0 / 全 1 编码特殊值(含另一类"非规格化数",见 4.2 表)。

4.1 格式(必背)

格式总位数符号 S阶码 E(含偏置)尾数 M偏置值
单精度 float321823127
双精度 double64111521023

位排列(单精度):

3130 … 2322 … 0
S阶码 E(8 位)尾数 M(23 位)

规格化数的真值:

N=(−1)S×1.M×2E−127(单精度)N = (-1)^S \times 1.M \times 2^{E-127} \quad (\text{单精度})

注意 1.M1.M 的"1"是隐含位,不占存储,这是 IEEE 754 多一位精度的来源。

4.2 特殊值(必背,选择题高频)

阶码 E尾数 M含义
全 0全 0±0\pm0(符号位区分正负零)
全 0非全 0非规格化数,隐含位是 0:N=(−1)S×0.M×2−126N = (-1)^S \times 0.M \times 2^{-126}
全 1全 0±∞\pm\infty
全 1非全 0NaN

单精度规格化数范围:2−126∼(2−2−23)×21272^{-126} \sim (2-2^{-23}) \times 2^{127}。阶码真值范围 −126∼+127-126 \sim +127(全 0、全 1 被特殊值占用)。

4.3 十进制 → IEEE 754 全流程【待动画化】

例:将 −12.75-12.75 转为单精度十六进制。

  1. 整数/小数分开转二进制:12=1100212 = 1100_2;0.75=0.1120.75 = 0.11_2(0.75×2=1.50.75\times2=1.5 取 1,0.5×2=1.00.5\times2=1.0 取 1);故 −12.75=−1100.112-12.75 = -1100.11_2
  2. 规格化:−1100.11=−1.1001 12×23-1100.11 = -1.1001\,1_2 \times 2^3,得 S=1S=1,尾数(去隐含 1)=1001 1= 1001\,1
  3. 算阶码:E=3+127=130=1000 00102E = 3 + 127 = 130 = 1000\,0010_2
  4. 拼位:1 ∣ 10000010 ∣ 1001 1000 0000 0000 0000 0001\ |\ 10000010\ |\ 1001\,1000\,0000\,0000\,0000\,000(尾数右补 0 至 23 位)
  5. 转十六进制:按 4 位分组 1100 0001 0100 1100 ⋯=C14C0000H1100\,0001\,0100\,1100\,\dots = \text{C14C0000H}

反向:0x41C80000 = ?

  1. 展开二进制:0100 0001 1100 1000 0000 0000 0000 00000100\,0001\,1100\,1000\,0000\,0000\,0000\,0000
  2. 拆分:S=0S=0;E=1000 00112=131E = 1000\,0011_2 = 131;M=100 1000…0M = 100\,1000\dots0
  3. 阶码真值 =131−127=4= 131-127 = 4;尾数 =1.10012= 1.1001_2
  4. N=+1.10012×24=110012=25.0N = +1.1001_2 \times 2^4 = 11001_2 = 25.0

4.4 浮点四则运算流程(大题模板)

加/减五步:对阶 → 尾数运算 → 规格化 → 舍入 → 判溢出。

  1. 对阶:小阶向大阶看齐,阶小的尾数右移(每移 1 位阶加 1)。为什么不能大阶向小阶?——尾数左移会丢失高位有效数字,右移只丢低位,损失更小。
  2. 尾数运算:按补码(或教材口径的原码/补码体系)加减。
  3. 规格化:
    • 右规:尾数溢出(如出现 1x.xxxx1x.xxxx 或双符号位异常,∣尾数∣>1|尾数|>1)时尾数右移 1 位、阶加 1。右规可能引发阶码上溢。
    • 左规:尾数非规格化(补码下符号位与最高数值位相同,即形如 0.0xx0.0xx 或 1.1xx1.1xx)时尾数左移、阶减 1,直到规格化。左规可能引发阶码下溢(下溢一般按机器零处理,不算严重错误)。
  4. 舍入:右移丢位时处理精度。IEEE 754 默认就近舍入(向偶数舍入, round to nearest even ):丢位后若超出半程则进位,恰为半程(丢弃部分 = 100…0)则使尾数最低位凑成偶数;另有朝 +∞+\infty、朝 −∞-\infty、朝 0(截断)三种定向舍入。
  5. 判溢出:溢出的判定只看阶码是否溢出,尾数溢出不算真溢出(可通过右规挽救)。阶码上溢 → 异常/无穷;下溢 → 按机器零。

乘除:阶码相加/相减(减去偏置修正——两数偏置加了两次,单精度须再减 127),尾数相乘/相除,其余步骤同上。

对阶计算示例:x=201×0.1101x = 2^{01} \times 0.1101,y=211×0.1010y = 2^{11} \times 0.1010,求 x+yx+y(阶码 3 位含符号口径):

  1. 对阶:xx 阶小,xx 尾数右移 2 位:x=211×0.0011x = 2^{11} \times 0.0011(01 丢弃,此处先不精究舍入)
  2. 尾数相加:0.0011+0.1010=0.11010.0011 + 0.1010 = 0.1101
  3. 结果 211×0.11012^{11} \times 0.1101 已规格化,无溢出

五、C 语言中的数据类型转换(真题高频)

工程师天天写隐式转换,考试考的是位级口径——位模式变不变、值怎么变:

转换方向位模式值
同长度 signed ↔ unsigned不变解释改变
长整型 → 短整型保留低位、截断高位通常改变
int → float/double重新编码为 IEEE 754可能损失精度
float/double → int重新编码为补码小数截断(向零取整)
double → float重新编码舍入,可能溢出为 ±∞
  1. 有符号 ↔ 无符号:(unsigned)(-1) = FFFFFFFFH = 4294967295。比较运算中有一方是无符号数,另一方也被转为无符号解释:int i=-1; unsigned u=1; 则 i < u 为假。
  2. int → float:float 尾数有效位仅 24(隐含 1 + 23),而 int 有 31 个数值位,∣x∣>224|x| > 2^{24} 的整数不能全部精确表示;int → double(53 位有效)总能精确。
  3. float/double → int:小数部分截断(向零舍入),1.9→11.9 \to 1、−1.9→−1-1.9 \to -1;超出 int 范围时结果无意义(超界)。
  4. char 的符号性:C 标准未定义,408 教材口径按补码(有符号)处理。

典型判断:float f = 16777217;(224+12^{24}+1)实际存储值为 1677721616777216(224+12^{24}+1 恰在 2242^{24} 与 224+22^{24}+2 中点,向偶数舍入取 2242^{24}),故 f == 16777216 为真。

例题

例题 1(模拟题) 求信息位 8 位的海明码所需校验位数。

解:2k≥8+k+12^k \ge 8+k+1:k=3k=3 时 8≥128 \ge 12 不成立;k=4k=4 时 16≥1316 \ge 13 成立。答案 4。

例题 2(模拟题) 信息位 1100,生成多项式 G(x)=x3+x+1G(x)=x^3+x+1(1011),求 CRC 码字。

解:被除数 1100000。模 2 除:1100 ⊕ 1011 = 0111,落下 0 得 1110;1110 ⊕ 1011 = 0101,落下 0 得 1010;1010 ⊕ 1011 = 0001,落下 0 得 0010(最高位 0,商 0)。余数 010,码字 = 1100 010。自检:1100010 ÷ 1011 余 0。

例题 3(模拟题) 8 位补码 80H、FFH 分别表示的真值?

解:80H = 1000 0000,符号位 1、数值位取反加一 = 1000 0000=1281000\,0000 = 128,故真值 −128-128(最小负数,唯一没有对应正数的补码);FFH = 1111 1111 → 取反加一 = 1,真值 −1-1。

例题 4(模拟题) 判断 8 位补码运算 86+4286+42 是否溢出并说明方法。

解:见 3.2 分步演示,正溢出;双符号位结果 01(正溢出),单符号位进位异或 0⊕1=10 \oplus 1 = 1 也判定溢出,两种方法一致。

例题 5(模拟题) 将 25.025.0 转为 IEEE 754 单精度十六进制,并反向验证。

解:见 4.3 反向示例,25.0=0x41C8000025.0 = 0x41C80000。

例题 6(模拟题) float 变量能否精确存储 0.10.1?能否精确存储 0.250.25?

解:0.10.1 的二进制为无限循环(0.000 1100 1100…20.000\,1100\,1100\dots_2),不能精确;0.25=2−20.25 = 2^{-2},分母是 2 的幂,能精确(S=0,E=125=0111 1101,M=0S=0, E=125=0111\,1101, M=0,即 0x3E800000)。

例题 7(模拟题) int i = -1; unsigned u = 1; 判断 i < u 的结果并解释。

解:为假。i 被提升为无符号解释,FFFFFFFH = 4294967295 > 1。位模式一字未改,只是"贴的标签"变了——这正是本章"表示"与"值"分离的核心。

例题 8(模拟题) 8 位补码 92H 符号扩展为 16 位,结果的十六进制是多少?

解:92H = 1001 0010,最高位(符号位)为 1,是负数,扩展时高位补 1:高 8 位 FFH,结果 FF92H(真值 −(65536−65426)=−110-(65536-65426) = -110;验证:92H 无符号值 146,146−256=−110146-256=-110 ✓)。

常见坑

  1. 对阶方向:小阶向大阶(小阶尾数右移)。记忆锚:低个子向高个子看齐,蹲下(右移)比踮脚(左移)安全。
  2. 右规与左规的时机:尾数绝对值 > 1 → 右规(可能阶上溢);尾数非规格化(符号位与首位数值位相同)→ 左规(可能阶下溢)。考试最爱混着考"尾数溢出 = 浮点溢出"这个错误说法——尾数溢出可右规挽救,阶码溢出才是浮点溢出。
  3. 双符号位 01 是正溢出、10 是负溢出(不是反的);01/10 里第一位才是真实符号。
  4. 海明码 2k≥n+k+12^k \ge n+k+1 别忘"+1";CRC 补 0 个数 = 生成多项式最高次幂(位数减一),不是位数。
  5. IEEE 754 阶码全 0/全 1 有特殊含义:规格化数阶码真值范围是 −126∼127-126\sim127,不是 −127∼128-127\sim128。
  6. 移码 = 补码符号位取反,但只适用于同一偏置口径;float 的 E 直接就是移码。
  7. 8 位补码范围 −128∼127-128\sim127:−128-128 有、+128+128 无;问"[x]补=80H[x]_补=80H 再取负"是无解陷阱。
  8. 奇校验/偶校验 vs 奇偶位数值:偶校验位等于信息位异或(使总数为偶),别记反。
  9. 有符号与无符号比较:一方无符号则双方按无符号解释,-1 < 1u 为假——工程上未必踩坑(编译器告警),考试专考这一条。
  10. int → float 可能丢精度(float 只有 24 位有效),int → double 不会(53 > 31);"整型转浮点一定精确"是错误选项常客。

自测

  1. 十进制 0.625 转二进制小数,结果是什么?
  2. 信息位 16 位,海明码校验位至少几位?
  3. CRC 中"模 2 除法"与普通除法的本质区别是什么?
  4. 8 位机器中,[x]移=00H[x]_移 = 00H 对应的真值是多少?
  5. IEEE 754 单精度 0x7F800000 和 0xFFC00000 各代表什么?
  6. 浮点加减中,什么情况左规、什么情况右规?为什么对阶只能小向大?
  7. 为什么 int 转 double 不丢精度,转 float 却可能丢?

自测答案与简析

  1. 0.625×2=1.250.625\times2=1.25(1),0.25×2=0.50.25\times2=0.5(0),0.5×2=1.00.5\times2=1.0(1)→ 0.10120.101_2,可精确表示。
  2. 25=32≥16+5+1=222^5=32 \ge 16+5+1=22,而 k=4k=4 时 16<2116<21,故 5 位。
  3. 模 2 除法每步做异或、不进位不借位,也不比较大小(首 1 即商 1)。
  4. 0−128=−1280 - 128 = -128(移码 00H = 补码 80H = 真值 −128,移码最小值)。
  5. 前者阶码全 1、尾数全 0、符号 0 → +∞+\infty;后者阶码全 1、尾数非 0 → NaN(符号位对 NaN 无意义)。
  6. 尾数溢出(|尾数|>1)右规(尾数右移阶加 1);尾数非规格化左规(尾数左移阶减 1)。大阶向小阶需尾数左移,会丢失高位有效位,故只能小阶向大阶。
  7. double 尾数有效位 53 位 > int 的 31 个数值位,足以放下;float 只有 24 位有效位,∣x∣>224|x| > 2^{24} 的整数放不下。