mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6
22844 字
62 分钟
数据信息的表示

本文整理计算机中数据信息的表示与校验方法。在计算机组成原理中,掌握定点数与浮点数的表示与计算,以及校验码的设计原理是第二章的复习重点。


第2章:数据信息的表示#


2.1 数据表示的作用#

计算机内部的所有信息都必须以二进制代码的形式进行存储与处理。现实世界中的各种数据在输入计算机时,均需被编码转换为二进制形式。

flowchart TD Data[数据信息] --> Numeric[数值数据: 带有确定数值意义的数] Data --> NonNumeric[非数值数据: 文字、字符与多媒体] Numeric --> Unsigned[无符号数] Numeric --> Signed[有符号数] Signed --> Fixed[定点数] Signed --> Float[浮点数] NonNumeric --> Char[字符与文字] NonNumeric --> Media[多媒体数据: 图像、声音、视频]

2.2 数值数据的表示#

定点数是指小数点位置固定不变的数。在计算机中,定点数通常用于表示整数,或在某些特定场景下表示纯小数。

2.2.1 无符号数与有符号数#

  • 无符号数:所有二进制位都代表数值大小,没有符号位。对于 nn 位的无符号数,其表示范围为: 02n10 \sim 2^n - 1
  • 有符号数:通常将二进制数的最高位作为符号位,其中用 0 表示正数,用 1 表示负数。

原码、反码、补码#

为了便于在硬件电路中进行算术运算,有符号数在计算机内部有不同的编码表示方法。

  • 原码:最高位为符号位,其余各位表示数值的绝对值。

    特点:原码表示直观,但 0 的表示不唯一(存在正 0 和负 0 两种形式),且加减法运算规律复杂,符号位不能直接参与运算。

  • 反码:正数的反码与原码相同;负数的反码则是符号位保持不变,数值位按位取反。
  • 补码:正数的补码与原码相同;负数的补码则是其反码在最低位加 1。

    求补码的速记法:负数原码自右向左数,找到第一个“1”,该“1”及其右边的所有“0”保持不变,该“1”左边的所有数值位按位取反,符号位保持不变。

补码的核心优势

补码的引入彻底解决了原码运算的硬件难题。其优势主要体现在:

  1. 加减法运算统一:减法运算可以转换为加上一个负数的补码,使加减法器统一为加法器电路。
  2. 零的表示唯一:在补码中,正 0 和负 0 的编码合并为唯一编码。
  3. 符号位参与运算:符号位可以与数值位一同参与算术运算,无需单独的电路判断符号。

2.2.2 定点数表示:补码范围及其不对称性#

定点数根据小数点位置的不同,可分为定点整数和定点小数。在补码表示下,两者的范围表现出独特的不对称性。

定点整数的补码范围#

对于 nn 位补码定点整数(含 1 位符号位, n1n-1 位数值位),其表示范围为:

2n12n11-2^{n-1} \sim 2^{n-1} - 1

以 8 位补码为例:

  • 最大正数为:011111112=+12701111111_2 = +127
  • 最小负数为:100000002=12810000000_2 = -128
  • 8 位补码范围为:128+127-128 \sim +127

定点小数的补码范围#

对于 nn 位补码定点小数(含 1 位符号位,小数点固定在符号位之后),其表示范围为:

112(n1)-1 \sim 1 - 2^{-(n-1)}

以 8 位补码小数为例:

  • 最大正数为:0.11111112=1270.1111111_2 = 1 - 2^{-7}
  • 最小负数为:1.00000002=11.0000000_2 = -1
  • 8 位补码小数范围为:1127-1 \sim 1 - 2^{-7}
补码范围不对称的根本原因

在原码和反码中,数值 0 占用了两个编码(例如 8 位原码中 00000000200000000_210000000210000000_2 均表示 0)。 而在补码中,0 仅有唯一编码(00000000200000000_2)。原本在原码中表示负 0 的编码(如 8 位下的 10000000210000000_2),在补码中被赋予了新的数值意义,用于表示最小的负数(即 128-1281-1)。因此,补码的负数表示范围比正数多一个。

应用例题:补码范围与转换#

例题 1:设机器字长为 16 位,求该机器在补码表示下所能表示的定点整数范围。

解析: 将 n=16n = 16 代入定点整数补码范围公式 2n12n11-2^{n-1} \sim 2^{n-1} - 1

2152151-2^{15} \sim 2^{15} - 1

展开后即为:

32768+32767-32768 \sim +32767

变形补码与溢出检测机制#

变形补码又称为双符号位补码,它采用两位二进制来表示数值的符号。

  • 符号位定义00 表示正数,11 表示负数。
  • 溢出判断原理:在变形补码加减运算中,若结果的两位符号位不同,则表明发生了溢出。具体为:
    • 01:表示两个正数相加,结果超出了最大正数范围,称为正溢出
    • 10:表示两个负数相加,结果超出了最小负数范围,称为负溢出
变形补码的核心考点
  1. 溢出检测门电路:在定点运算器中,不论是单符号位(检测最高位进位与符号位进位是否相异)还是双符号位,溢出判断的逻辑本质都是异或判定,因此在硬件上都使用异或门电路实现。
  2. 能否避免溢出:变形补码只能使计算机更容易检测出溢出状态,但绝不能避免或阻止溢出的发生。若要避免溢出,必须扩大寄存器字长或采用浮点数表示。

定点数的算术移位规则#

移位运算在计算机中有广泛应用。对于定点有符号数,在进行算术移位时,符号位保持不变,数值位移动时空出位置的填充规则如下:

机器数类型对应正负左移空位填充右移空位填充
原码正数与负数填充 0填充 0
补码正数填充 0填充 0
补码负数填充 0填充 1
补码算术右移实例

补码负数算术右移时,高位空出处填充符号位 1。例如有符号补码整数 01010100201010100_2(为正数,符号位为 0)算术右移两位后,高位补 0 得到 00010101200010101_2


2.2.3 浮点数表示:编码与规格化#

定点数的小数点位置固定,这限制了它的数值表示范围和精度。浮点数通过将小数点的位置设计为可浮动的形式,能够以较短的字长表示极大或极小的数。

浮点数的一般格式#

在计算机中,浮点数通常表示为:

N=M×2EN = M \times 2^E

其中,尾数 MM 决定了浮点数的精度,阶码 EE 决定了浮点数的范围和位置。

为了保证浮点数表示的唯一性并提高表示精度,必须对浮点数进行规格化处理。规格化要求尾数的绝对值在特定范围内。 对于定点小数补码表示的尾数,规格化形式要求符号位与数值最高位相反,即:

  • 正数为:0.120.1\dots\dots_2
  • 负数为:1.021.0\dots\dots_2

IEEE 754 标准#

现代计算机通常采用 IEEE 754 标准进行浮点数存储与计算。

gantt title IEEE 754 单精度浮点数 32 位布局 dateFormat X axisFormat %s section 字段 符号位 S (1位) : 0, 1 阶码 E (8位) : 1, 9 尾数 M (23位) : 9, 32

1. 单精度浮点数#

  • 位宽:32 位。
  • 结构分配:1 位符号位,8 位阶码,23 位尾数。
  • 偏置值:阶码采用移码表示,偏置值为 127。
  • 计算公式V=(1)S×1.M×2E127V = (-1)^S \times 1.M \times 2^{E - 127}

2. 双精度浮点数#

  • 位宽:64 位。
  • 结构分配:1 位符号位,11 位阶码,52 位尾数。
  • 偏置值:阶码采用移码表示,偏置值为 1023。
  • 计算公式V=(1)S×1.M×2E1023V = (-1)^S \times 1.M \times 2^{E - 1023}
阶码采用移码表示的原因

阶码用于表示小数点移动的位数,带有正负。在比较两个浮点数的大小时,如果直接使用有符号的补码表示阶码,硬件电路比较大小时需要进行复杂的符号判断。而使用移码(即在真实指数上加上一个固定的正偏置值),可以将所有的指数转换成无符号的非负整数。这样,硬件可以直接使用无符号比较器来快速比较阶码的大小,从而简化了对阶操作的硬件实现。

应用例题:十进制数向单精度浮点数的转换#

例题 2:将十进制数 20.375-20.375 转换为单精度浮点数的十六进制格式。

解析

  1. 将绝对值转换为二进制数
    • 整数部分:20=10100220 = 10100_2
    • 小数部分:0.375=0.25+0.125=22+23=0.01120.375 = 0.25 + 0.125 = 2^{-2} + 2^{-3} = 0.011_2
    • 组合得到二进制数值:10100.011210100.011_2
  2. 对二进制数进行规格化
    • 移动小数点,使左边仅保留一位有效数字 1: 10100.0112=1.01000112×2410100.011_2 = 1.0100011_2 \times 2^4
    • 真实指数为 e=4e = 4
  3. 确定各个字段的二进制编码
    • 符号位:由于原数是负数,故 S=1S = 1
    • 阶码:真实指数为 4,单精度偏置值为 127。计算阶码的移码: E=4+127=131=100000112E = 4 + 127 = 131 = 10000011_2
    • 尾数:规格化后的小数部分为 010001120100011_2,补足到 23 位得到: M=010001100000000000000002M = 01000110000000000000000_2
  4. 拼接二进制编码并转换
    • 将上述字段按顺序拼接为 32 位二进制串: 1  10000011  010001100000000000000001 \ | \ 10000011 \ | \ 01000110000000000000000
    • 每 4 位划分为一组,转换为十六进制:
      • 1100 0001 1010 0011 0000 0000 0000 000021100 \ 0001 \ 1010 \ 0011 \ 0000 \ 0000 \ 0000 \ 0000_2
      • 转换结果为:C1A30000H\text{C1A30000H}

2.2.4 浮点数加减运算步骤与对阶原则#

浮点数加减运算的实现过程较为复杂,在计算机硬件中通常分为以下五个核心步骤进行:

  1. 对阶:使两个操作数的阶码大小一致,这是进行尾数求和的前提。
  2. 尾数求和:对阶完成后的两个尾数进行算术加减运算。
  3. 规格化:若求和后的尾数不满足规格化格式,需要通过左规或右规进行调整。
  4. 舍入:在对阶和右规过程中可能导致尾数低位被丢弃,需要执行舍入处理(如“0舍1入”法)以减小精度误差。
  5. 溢出判断:判定阶码是否超出了表示范围。
对阶原则:小阶向大阶看齐

浮点加减中的对阶操作必须遵循小阶向大阶看齐的原则。即阶码小的数向阶码大的数对齐。对阶时,小阶的尾数右移,其阶码同步加 1,直到与大阶的阶码相等。

原理剖析:如果强行将大阶向小阶对齐,大阶的尾数就需要向左移位,这会导致尾数高位(最重要的有效数字)被移出丢弃,造成严重的数值错误。而小阶向大阶看齐时尾数右移,虽然丢弃了尾数低位数字,但这仅会造成微小的精度损失,而不会影响数值大体范围,因此在硬件上是唯一正确的选择。

浮点溢出的真谛:浮点数的溢出完全取决于阶码是否发生溢出。尾数求和后产生的溢出(如尾数进位)可以通过右规并增加阶码来修正,不代表真正的溢出;只有当阶码超出其所能表示的最大正指数(上溢)时,才会真正触发浮点溢出报错。


2.2.5 计算机中的数据类型与类型转换机制#

在高级编程语言中,数据具有明确的类型属性。在不同数据类型之间进行转换时,底层的二进制处理逻辑各有不同。

符号扩展与零扩展#

当把短字长的数据转换为长字长的数据时,需要填补高出的空位。

  • 符号扩展:用于有符号数。高位填充原数据的符号位(正数填 0,负数填 1),从而确保数值大小不变。
  • 零扩展:用于无符号数。高位一律填充 0,保证无符号数值的等价性。
符号扩展实例

设机器中 8 位有符号补码表示的数为 11111011211111011_2(对应十进制 5-5)。 当其扩展为 16 位有符号整数时,执行符号扩展,高位全部补符号位 1:

11111111 11111011211111111 \ 11111011_2

该数在 16 位补码下的数值依然是 5-5

截断#

当把长字长的数据转换为短字长的数据时,计算机会直接丢弃高位,仅保留低位数值。

  • 影响:截断可能会彻底改变原数据的符号和大小,从而导致溢出和精度丢失。

大端与小端存储模式#

对于多字节的复合数据(如 32 位定点整数、64 位双精度浮点数),其存放在连续的内存字节中时,需要决定各字节的物理排列顺序。

  • 大端方式:将数据的最高有效字节(即数值的高位字节部分)存储在低内存地址中。这种排列方式与人类从左到右的书写阅读习惯完全一致。
  • 小端方式:将数据的最低有效字节(即数值的低位字节部分)存储在低内存地址中。这种方式便于计算机硬件直接从低位地址读取基础数值。
小端模式内存字节布局分析

设有一个双精度浮点数机器码为 1122 3344 5566 7788H,其最高有效字节为 11H,最低有效字节为 88H。若将其从小端方式存放在以地址 0000 8040H 开始的连续存储单元中,其物理分布如下:

  • 0000 8040H 单元存放最低有效字节:88H
  • 0000 8041H 单元存放:77H
  • 0000 8042H 单元存放:66H
  • 0000 8043H 单元存放:55H
  • 0000 8044H 单元存放:44H
  • 0000 8045H 单元存放:33H
  • 0000 8046H 单元存放:22H
  • 0000 8047H 单元存放最高有效字节:11H

在期末考查中,经常给出 double 型变量的十六进制编码,要求指出小端方式下特定物理单元(如 8042H8046H)中存放的具体内容。解题关键即在画出低地址存放低字节的对应表。


2.3 非数值数据的表示#

非数值数据在计算机中同样通过特定的编码方式进行表示。

字符编码#

最常用的字符编码为 ASCII 码,它使用 7 位或 8 位二进制代码来表示英文字母、数字和控制字符。在考试中,需熟记以下基准字符的对应关系:

  • 字符 '0' 对应的码值为 48(十六进制 30H)
  • 字符 'A' 对应的码值为 65(十六进制 41H)
  • 字符 'a' 对应的码值为 97(十六进制 61H)
  • 大小写字母的转换关系为:大写字母与对应的小写字母码值相差 32。

汉字编码#

为了支持汉字的输入、处理和输出,计算机系统定义了多种汉字编码:

  • 输入码:用于汉字输入(如拼音输入码、五笔字型码)。
  • 国标码:作为汉字交换码,用于不同系统间的数据交换。
  • 机内码:在计算机系统内部存储和处理汉字时使用的编码。
  • 字形码:用于汉字的显示和打印输出。
汉字编码之间的换算公式

在字符处理中,区位码、国标码和机内码存在以下确定的计算对应关系(计算时需统一转换为十六进制):

  1. 国标码 = 区位码(十六进制表示) + 2020H
  2. 机内码 = 国标码 + 8080H

2.4 数据信息的校验#

数据在网络传输或硬件存储时,由于物理噪声等干扰可能会发生位翻转。为了保障数据的正确性,需要引入校验码。

2.4.1 码距与校验#

码距是指在一个编码系统中,任意两个合法码字之间不同二进制位的最小个数。

码距与纠错公式

设校验码系统的最小码距为 dd

  1. 若要检测 ee 位错误,则必须满足:de+1d \ge e + 1
  2. 若要纠正 tt 位错误,则必须满足:d2t+1d \ge 2t + 1
  3. 若要同时检测 ee 位错误并纠正 tt 位错误(其中 ete \ge t),则必须满足:de+t+1d \ge e + t + 1

2.4.2 奇偶校验#

奇偶校验通过在原数据位后附加 1 位校验位,使编码中二进制“1”的总个数满足特定奇偶性。

  • 偶校验:使数据位与校验位中 1 的总个数为偶数。
  • 奇校验:使数据位与校验位中 1 的总个数为奇数。
  • 局限性:奇偶校验的最小码距为 2。它只能检测出奇数个二进制位发生翻转的错误,无法定位错误发生的位置,因此不具备纠错能力。

2.4.3 海明校验#

海明校验通过在数据位中合理地插入多个校验位,并将数据划分为多个交叉的校验小组,从而实现检测错误并自动定位纠错的目的。其最小码距为 3。

核心步骤一:确定校验位个数#

设数据位的位数为 mm,海明码需要插入的校验位的位数为 rr。它们必须满足以下关系式:

2rm+r+12^r \ge m + r + 1

实际计算例题#

例题 3:已知需要传输的数据为 8 位二进制数据 10110100,求设计海明码时所需要的校验位位数 rr

解析: 已知 m=8m = 8,代入公式 2r8+r+12^r \ge 8 + r + 1 进行试算:

  • r=3r = 323=8<8+3+1=122^3 = 8 < 8 + 3 + 1 = 12,不满足条件。
  • r=4r = 424=168+4+1=132^4 = 16 \ge 8 + 4 + 1 = 13,满足条件。

结果:需要设计 4 位校验位。总的海明码位宽为 8+4=128 + 4 = 12 位。


核心步骤二:确定校验位与数据位的位置分配#

海明码的校验位 PiP_i 必须放置在整个编码中编号为 2k2^k(即 1, 2, 4, 8, 16 等)的位置上,其余位置则按顺序填充数据位 DjD_j。 对于上述 12 位海明码,其位置分配如下表所示:

海明码位号123456789101112
字符类型P1P_1P2P_2D1D_1P3P_3D2D_2D3D_3D4D_4P4P_4D5D_5D6D_6D7D_7D8D_8
填入数值P1P_1P2P_21P3P_3011P4P_40100

核心步骤三:划分子集与计算校验位的值(偶校验)#

海明码中,任何一个数据位号均可拆分为多个校验位号之和。例如:

  • 3=1+2    D13 = 1 + 2 \implies D_1 同时属于 P1P_1P2P_2 的校验组
  • 5=1+4    D25 = 1 + 4 \implies D_2 同时属于 P1P_1P3P_3 的校验组
  • 6=2+4    D36 = 2 + 4 \implies D_3 同时属于 P2P_2P3P_3 的校验组
  • 7=1+2+4    D47 = 1 + 2 + 4 \implies D_4 同时属于 P1P_1P2P_2P3P_3 的校验组
  • 9=1+8    D59 = 1 + 8 \implies D_5 同时属于 P1P_1P4P_4 的校验组
  • 10=2+8    D610 = 2 + 8 \implies D_6 同时属于 P2P_2P4P_4 的校验组
  • 11=1+2+8    D711 = 1 + 2 + 8 \implies D_7 同时属于 P1P_1P2P_2P4P_4 的校验组
  • 12=4+8    D812 = 4 + 8 \implies D_8 同时属于 P3P_3P4P_4 的校验组

按照偶校验原则(校验组内所有位异或结果为 0),写出各校验组的表达式:

  • P1D1D2D4D5D7=0P_1 \oplus D_1 \oplus D_2 \oplus D_4 \oplus D_5 \oplus D_7 = 0
  • P2D1D3D4D6D7=0P_2 \oplus D_1 \oplus D_3 \oplus D_4 \oplus D_6 \oplus D_7 = 0
  • P3D2D3D4D8=0P_3 \oplus D_2 \oplus D_3 \oplus D_4 \oplus D_8 = 0
  • P4D5D6D7D8=0P_4 \oplus D_5 \oplus D_6 \oplus D_7 \oplus D_8 = 0

将已知数据值代入:

  • P110100=0    P10=0    P1=0P_1 \oplus 1 \oplus 0 \oplus 1 \oplus 0 \oplus 0 = 0 \implies P_1 \oplus 0 = 0 \implies P_1 = 0
  • P211110=0    P20=0    P2=0P_2 \oplus 1 \oplus 1 \oplus 1 \oplus 1 \oplus 0 = 0 \implies P_2 \oplus 0 = 0 \implies P_2 = 0
  • P30110=0    P30=0    P3=0P_3 \oplus 0 \oplus 1 \oplus 1 \oplus 0 = 0 \implies P_3 \oplus 0 = 0 \implies P_3 = 0
  • P40100=0    P41=0    P4=1P_4 \oplus 0 \oplus 1 \oplus 0 \oplus 0 = 0 \implies P_4 \oplus 1 = 0 \implies P_4 = 1

得到海明校验码最终序列为:

0010011101002001001110100_2

核心步骤四:错误检测与纠错#

接收端在收到海明码后,会重新计算各校验组的指征值 SiS_i

  • S1=P1D1D2D4D5D7S_1 = P_1 \oplus D_1 \oplus D_2 \oplus D_4 \oplus D_5 \oplus D_7
  • S2=P2D1D3D4D6D7S_2 = P_2 \oplus D_1 \oplus D_3 \oplus D_4 \oplus D_6 \oplus D_7
  • S3=P3D2D3D4D8S_3 = P_3 \oplus D_2 \oplus D_3 \oplus D_4 \oplus D_8
  • S4=P4D5D6D7D8S_4 = P_4 \oplus D_5 \oplus D_6 \oplus D_7 \oplus D_8

组合指征值 S4S3S2S1S_4S_3S_2S_1 即为错误发生的物理位置。

移码与补码的关系#

与其对应的移码之间仅有最高位(符号位)相反,其余各位完全一致。

常见类型转换与数据大小变化
  • 无符号数扩展:直接在高位补 0,数值绝对不变。
  • 有符号数扩展:采用符号扩展,正数高位补 0,负数高位补 1,数值绝对不变。
  • 大类型转小类型:发生截断,极易导致溢出,从而使原数值的符号和数值发生剧变。
浮点数的溢出判定

浮点数的溢出与定点数不同。浮点数是否发生溢出,完全取决于其阶码是否发生溢出(当阶码超出其最大正阶表示范围时即为上溢,当阶码低于最小负阶表示范围时即为下溢,下溢一般当作 0 处理,不引发系统中断)。尾数的溢出只影响表示精度,通常可通过规格化或舍入进行修正,不直接触发系统溢出报错。


常见考试易错点警示#

易错点 1:海明码公式中字符含义混淆

公式 2rm+r+12^r \ge m + r + 1 中, mm 代表的是纯数据位的长度,而不是总的海明码长度。在计算时切忌直接代入总长度。

易错点 2:浮点数规格化判断中正负数的差异

在补码浮点数中,规格化尾数的最高数值位与符号位必须相反。对于负数,其尾数最高数值位必须是 0,即格式为 1.021.0\dots\dots_2。许多考生常误认为负数规格化也必须是最高位为 1。


2.6 历年期末真题分类详解#

本节整理了 5 份期末考试真题中涉及本章的全部考题,进行系统化分类与解析。

2.6.1 原码、反码、补码、移码转换#

Q1 (2022-2023-2 简答题)#

题干:用一个字节存放有符号整数,若某数真值为 75-75,请写出它的四种机器数(原码、反码、补码、移码)。

解析

  1. 一个字节为 8 位,最高位为符号位,剩余 7 位为数值位。
  2. 75=64+8+2+1=1001011275=64+8+2+1=1001011_2,写成 7 位为 1001011
  3. 负数原码:符号位为 1,数值位为绝对值: [75]=11001011[-75]_{\text{原}}=11001011
  4. 负数反码:符号位不变,数值位取反: [75]=10110100[-75]_{\text{反}}=10110100
  5. 负数补码:反码末位加 1: [75]=10110101[-75]_{\text{补}}=10110101
  6. 移码:补码符号位取反: [75]=00110101[-75]_{\text{移}}=00110101

答案:原码 11001011,反码 10110100,补码 10110101,移码 00110101

Q2 (2020-2021 A卷 计算题)#

题干:已知 X=1.10010X_{\text{补}}=1.10010Y=1.01110Y_{\text{原}}=1.01110,则 XXYY 的真值分别为多少?

解析

  1. X=1.10010X_{\text{补}}=1.10010,符号位为 1,是负数。
  2. 负数补码求真值:对补码求补得到绝对值。
1.10010数值位 10010 1.10010 \rightarrow \text{数值位 } 10010

取反:

0110101101

加 1:

0111001110

所以:

X=0.011102X=-0.01110_2
  1. Y=1.01110Y_{\text{原}}=1.01110,原码符号位为 1,直接表示负数:
Y=0.011102Y=-0.01110_2

答案X=0.011102X=-0.01110_2Y=0.011102Y=-0.01110_2

Q3 (2024-2025 C卷 填空题)#

题干:已知数的补码是 1.100101.10010,左边起第一个 1 是符号位,它的真值应为________。

解析

  1. 补码 1.100101.10010 的符号位为 1,是负数。
  2. 对数值位 10010 取反: 100100110110010 \rightarrow 01101
  3. 末位加 1: 01101+1=0111001101+1=01110
  4. 所以原码为: 1.011101.01110
  5. 真值为: 0.011102-0.01110_2
  6. 转十进制: 0.011102=22+23+24=0.25+0.125+0.0625=0.43750.01110_2=2^{-2}+2^{-3}+2^{-4}=0.25+0.125+0.0625=0.4375

答案0.011102-0.01110_2,即 0.4375-0.4375

Q4 (2024-2025 C卷 填空题)#

题干:若寄存器内容为 10000000,若它等于 0-0,则为________码。

解析

  1. 原码中: +0=00000000,0=10000000+0=00000000,\quad -0=10000000
  2. 反码中: +0=00000000,0=11111111+0=00000000,\quad -0=11111111
  3. 补码中 0 唯一: 0=000000000=00000000
  4. 题中 10000000 表示 0-0,只能是原码。

答案:原码。

Q5 (2020-2021 B卷 选择题)#

题干:设 xx 为整数,x=1,000 0001x_{\text{原}} = 1,000 \ 0001,则其真值为( )。 A. +1 B. -1 C. +128 D. -128

答案:B

解析

  • A [错误]+1+1 的原码应为 0,0000001,其符号位应为 0。
  • B [正确]1,0000001 的符号位为 1,数值位为 1,其代表的真值为 1-1
  • C [错误]:8 位原码的数值位只有 7 位,能够表示的最大正数为 +127+127,无法表示 +128+128
  • D [错误]:8 位原码能够表示的最小负数为 127-127,无法表示 128-128

Q6 (2019秋18级测试 计算题)#

题干:已知 x=0.1001x = 0.1001y=0.1010y = -0.1010,求 xx_{\text{补}}yy_{\text{原}}yy_{\text{补}}xx_{\text{移}}yy_{\text{移}}

解析

  1. x=0.1001x=0.1001 是正数,正数原码、反码、补码相同: x=0.1001x_{\text{补}}=0.1001
  2. xx 的移码等于补码符号位取反: x=1.1001x_{\text{移}}=1.1001
  3. y=0.1010y=-0.1010 是负数,原码为: y=1.1010y_{\text{原}}=1.1010
  4. 负数反码:符号位不变,数值位取反: y=1.0101y_{\text{反}}=1.0101
  5. 负数补码:反码末位加 1: y=1.0110y_{\text{补}}=1.0110
  6. yy 的移码等于补码符号位取反: y=0.0110y_{\text{移}}=0.0110

答案x=0.1001x_{\text{补}}=0.1001y=1.1010y_{\text{原}}=1.1010y=1.0110y_{\text{补}}=1.0110x=1.1001x_{\text{移}}=1.1001y=0.0110y_{\text{移}}=0.0110

Q7 (2019秋18级测试 填空题)#

题干:在机器码 ________ 和 ________ 中,零的编码是唯一的。

解析

  1. 原码有: +0=00000000,0=10000000+0=00000000,\quad -0=10000000 零不唯一。
  2. 反码有: +0=00000000,0=11111111+0=00000000,\quad -0=11111111 零不唯一。
  3. 补码中 0 只有一种编码。
  4. 移码中 0 也只有一种编码。

答案:补码、移码。

Q8 (2020-2021 B卷 选择题)#

题干:某机字长 16 位,采用补码形式(其中 1 位为符号位),则机器数所能表示的范围是( )。 A. 32767+32767-32767 \sim +32767 B. 32768+32768-32768 \sim +32768 C. 32768+32767-32768 \sim +32767 D. 32767+32768-32767 \sim +32768

答案:C

解析: 16 位补码定点整数(1 位符号位,15 位数值位)的表示范围为:

2152151-2^{15} \sim 2^{15} - 1

即:

32768+32767-32768 \sim +32767
  • A [错误]:未包含最小值 32768-32768
  • B [错误]:最大正数超出了 16 位补码定点整数的表示范围,最大正数应为 +32767+32767
  • C [正确]:范围为 32768+32767-32768 \sim +32767,与 16 位补码定点整数的表示范围一致。
  • D [错误]:最小值和最大值均不对。

2.6.2 补码加减运算#

Q9 (2022-2023-2 计算题)#

题干:已知 A=1001A = -1001B=0101B = -0101,求 A+BA+B 的补码。

解析

  1. A=10012A=-1001_2,用 5 位表示: A=1,1001A_{\text{原}}=1,1001 A=1,0110A_{\text{反}}=1,0110 A=1,0111A_{\text{补}}=1,0111
  2. B=01012B=-0101_2,用 5 位表示: B=1,0101B_{\text{原}}=1,0101 B=1,1010B_{\text{反}}=1,1010 B=1,1011B_{\text{补}}=1,1011
  3. 补码相加: 10111+11011=11001010111+11011=110010
  4. 机器字长为 5 位,丢弃最高进位: [A+B]=10010[A+B]_{\text{补}}=10010

答案[A+B]=10010[A+B]_{\text{补}}=10010

Q10 (2020-2021 B卷 计算题)#

题干:已知 x=0.1000x = 0.1000y=0.0101y = -0.0101,求 xx_{\text{补}}yy_{\text{补}}[x+y][x+y]_{\text{补}},并判断是否溢出。

解析

  1. x=0.1000x=0.1000 是正数: x=0.1000x_{\text{补}}=0.1000
  2. y=0.0101y=-0.0101y=1.0101y_{\text{原}}=1.0101 y=1.1010y_{\text{反}}=1.1010 y=1.1011y_{\text{补}}=1.1011
  3. 补码相加: 0.1000+1.1011=10.00110.1000+1.1011=10.0011
  4. 丢弃最高进位: [x+y]=0.0011[x+y]_{\text{补}}=0.0011
  5. 一正一负相加,不会溢出。

答案x=0.1000x_{\text{补}}=0.1000y=1.1011y_{\text{补}}=1.1011[x+y]=0.0011[x+y]_{\text{补}}=0.0011,无溢出。


2.6.3 变形补码与双符号位#

Q11 (2019秋18级测试 计算题)#

题干:采用变形补码计算 X+YX+Y 的补码,并判断是否溢出。X=+0.1101X = +0.1101Y=0.1001Y = -0.1001

解析

  1. 变形补码使用双符号位:正数为 00,负数为 11
  2. XX 为正数: X=00.1101X_{\text{补}}=00.1101
  3. Y=0.1001Y=-0.1001Y=11.1001Y_{\text{原}}=11.1001 Y=11.0110Y_{\text{反}}=11.0110 Y=11.0111Y_{\text{补}}=11.0111
  4. 相加: 00.1101+11.0111=100.010000.1101+11.0111=100.0100
  5. 丢弃最高进位,保留双符号位: [X+Y]=00.0100[X+Y]_{\text{补}}=00.0100
  6. 双符号位为 00,相同,无溢出。

答案[X+Y]=00.0100[X+Y]_{\text{补}}=00.0100,无溢出。

Q12 (2024-2025 C卷 选择题)#

题干:双符号位补码运算中,结果符号位为 10 表示( )。 A. 正溢出 B. 负溢出 C. 正常结果 D. 无溢出

答案:B

解析

  • A [错误]:在双符号位补码运算中,正溢出时的双符号位为 01,而不是 10
  • B [正确]:结果双符号位为 10 表示负溢出。
  • C [错误]:运算结果正常(无溢出)时,双符号位应相同,即为 00(正数)或 11(负数)。
  • D [错误]:无溢出时的双符号位为 0011,若为 10 则表明发生了负溢出。

Q13 (2024-2025 C卷 计算题)#

题干:用双符号位补码运算方法计算 x=0.1010x = 0.1010y=0.1100y = 0.1100 的和,并分析溢出状态。

解析

  1. 两数均为正数,双符号位为 00x=00.1010x_{\text{补}}=00.1010 y=00.1100y_{\text{补}}=00.1100
  2. 相加: 00.1010+00.1100=01.011000.1010+00.1100=01.0110
  3. 结果双符号位为 01
  4. 01 表示正溢出。

答案[x+y]=01.0110[x+y]_{\text{补}}=01.0110,发生正溢出。

Q14 (2022-2023-2 判断题)#

题干:采用变形补码进行加减运算可以避免溢出。( )

解析

  1. 变形补码用双符号位表示。
  2. 双符号位只能判断是否溢出。
  3. 它不能扩大机器字长,也不能避免溢出。

答案:错。


2.6.4 溢出判断#

Q15 (2020-2021 A卷 选择题)#

题干:在定点运算器中,无论是采用双符号位还是采用单符号位,必须有( )。 A. 译码电路 B. 编码电路 C. 溢出判断电路 D. 移位电路

答案:C

解析

  • A [错误]:译码电路在算术逻辑单元中用于指令或地址译码,并不是判断定点数加减运算溢出的必需部件。
  • B [错误]:编码电路用于将特定信号转换成二进制代码,不是溢出判断的核心逻辑部件。
  • C [正确]:无论是采用双符号位(判断两符号位是否相同)还是单符号位(判断最高数值位进位与符号位进位是否相同),运算器都需要配备溢出判断电路来检测运算结果是否超出了机器字长所能表示的数值范围。
  • D [错误]:移位电路主要用于实现数据的算术移位和逻辑移位操作,并非溢出判断的必需部件。

Q16 (2019秋18级测试 选择题)#

题干:在定点机中执行算术运算时会产生溢出,其根本原因是( )。 A. 主频过高 B. 运算结果无法表示 C. 寄存器位数不够 D. 内存容量不足

答案:B

解析

  • A [错误]:时钟主频仅决定计算机的运算速度,与算术运算是否产生溢出无关。
  • B [正确]:溢出的定义及根本原因在于运算结果超出了机器字长所能表示的最大数值范围,导致该运算结果无法在定点机中正确表示。
  • C [错误]:尽管寄存器位数有限是机器表示范围有限的原因,但溢出的直接根本表现依然是当前的具体运算结果超出了该范围而无法表示。
  • D [错误]:内存容量的大小决定程序与数据的存储空间,与算术运算中发生的数值溢出无关。

Q17 (2024-2025 C卷 判断题)#

题干:溢出判断电路一般用”与或非”门来实现。( )

解析

  1. 单符号位补码溢出常用进位异或判断。
  2. 双符号位补码溢出常用两个符号位异或判断。
  3. 因此常用的是异或逻辑,不是“与或非”门。

答案:错。


2.6.5 移位运算#

Q18 (2022-2023-2 填空题)#

题干:补码定点整数 01010101 左移两位后的值为___。

解析

  1. 原数: 0101010101010101
  2. 算术左移时,符号位保持不变,数值位左移,右端补 0。
  3. 符号位为 0,数值位为 1010101
  4. 数值位左移两位: 101010110101001010101 \rightarrow 1010100
  5. 加上符号位: 0101010001010100
  6. 左移过程中有有效位被丢弃,若要求按数值乘 222^2 解释,则发生溢出。

答案:机器码结果为 01010100

Q19 (2020-2021 A卷 填空题)#

题干:补码定点整数 01010100 算术右移两位后的值为( )。

解析

  1. 原数: 0101010001010100
  2. 符号位为 0,是正数。
  3. 算术右移时,左侧补符号位 0。
  4. 右移两位: 010101000001010101010100 \rightarrow 00010101

答案00010101


2.6.6 定点数表示范围#

Q20 (2022-2023-2 填空题)#

题干:8 位原码能表示的不同数据有___个。

解析

  1. 8 位二进制编码共有 28=2562^8 = 256 个不同的状态。
  2. 在原码表示法中,零有两种不同的编码形式,即正零(00000000200000000_2)和负零(10000000210000000_2),它们代表同一个数值 0。
  3. 因此,8 位原码能表示的不同数据个数为 2561=255256 - 1 = 255 个。其表示的具体范围为 127+127-127 \sim +127

2.6.7 浮点数与规格化#

Q21 (2019秋18级测试 填空题)#

题干:浮点数 20.5-20.5,根据 IEEE 754 单精度浮点数存储,其机器码是___。

解析

  1. 十进制转二进制: 20.5=10100.1220.5=10100.1_2
  2. 规格化: 10100.12=1.010012×2410100.1_2=1.01001_2\times 2^4
  3. 符号位: S=1S=1
  4. 阶码偏置为 127: E=4+127=131=100000112E=4+127=131=10000011_2
  5. 尾数取小数部分 01001,补足 23 位: M=01001000000000000000000M=01001000000000000000000
  6. 拼接: 1 10000011 010010000000000000000001\ 10000011\ 01001000000000000000000
  7. 转十六进制: 1100 0001 1010 0100 0000 0000 0000 0000=C1A40000H1100\ 0001\ 1010\ 0100\ 0000\ 0000\ 0000\ 0000=C1A40000H

答案C1A40000H

Q22 (2019秋18级测试 选择题)#

题干:若浮点数用补码表示,则判断运算结果是否为规格化数的方法是( )。 A. 阶符与尾符相同 B. 阶符与尾符相异 C. 数符与尾数小数点后第一位数字相异 D. 数符与尾数小数点后第一位数字相同

答案:C

解析

  • A [错误]:浮点数的规格化只取决于尾数,与阶符(阶码的符号位)和尾符(尾数的符号位)是否相同无关。
  • B [错误]:浮点数的规格化只取决于尾数,与阶符和尾符是否相异无关。
  • C [正确]:补码浮点数的规格化尾数形式要求符号位(数符)与尾数小数点后第一位数字(即尾数数值的最高位)相异。对于规格化的正数尾数,其形式为 0.1...;对于规格化的负数尾数,其形式为 1.0...
  • D [错误]:若数符与尾数小数点后第一位数字相同(即正数为 0.0...,负数为 1.1...),则说明尾数尚未进行规格化。

Q23 (2019秋18级测试 填空题)#

题干:浮点加、减运算的步骤是 、规格化、舍入、溢出判断。

解析

  1. 浮点加减先让两个数阶码相同,称为对阶。
  2. 阶码相同后,对尾数进行加减,称为尾数求和。
  3. 后续步骤为规格化、舍入、溢出判断。

答案:对阶、尾数求和。

Q24 (2024-2025 C卷 简答题)#

题干:请说明浮点数加减运算中对阶的原则,并以 A=0.1101×23A = 0.1101 \times 2^3B=0.1010×21B = 0.1010 \times 2^1 计算 A+BA+B

解析

  1. 对阶原则:小阶向大阶看齐。
  2. AA 的阶码为 3,BB 的阶码为 1。
  3. 因为 1<31<3,所以将 BB 的阶码升到 3。
  4. 阶码每增加 1,尾数右移 1 位;BB 的阶码增加 2,尾数右移 2 位: B=0.1010×21=0.001010×23B=0.1010\times 2^1=0.001010\times 2^3
  5. 尾数相加: 0.1101+0.001010=0.1111100.1101+0.001010=0.111110
  6. 所以: A+B=0.111110×23A+B=0.111110\times 2^3
  7. 尾数为 0.111110,符号位 0 与最高数值位 1 相异,已规格化。

答案:对阶原则是小阶向大阶看齐;A+B=0.111110×23A+B=0.111110\times 2^3


2.6.8 数据校验:奇偶校验#

Q25 (2020-2021 B卷 填空题)#

题干:需要传输 “11001110”,其奇校验位为( )。

解析

  1. 数据 11001110 中 1 的个数为: 55
  2. 奇校验要求数据位和校验位中 1 的总数为奇数。
  3. 现在 1 的个数已经是奇数,所以校验位应为 0。

答案:0。

Q26 (2022-2023-2 判断题)#

题干:奇偶校验可以校验奇数个位的出错,并能确定出错的位置。( )

解析

  1. 奇偶校验可以发现奇数个位发生错误。
  2. 但它只能判断“有错”,不能判断“错在哪里”。
  3. 所以不能确定出错位置。

答案:错。


2.6.9 数据校验:海明码#

Q27 (2020-2021 B卷 选择题)#

题干:用海明码对长度为 8 位的数据进行检错和纠错时,若能纠正一位错,则校验位数至少为( )。 A. 2 B. 3 C. 4 D. 5

答案:C

解析

  • A [错误]:若校验位数为 2,则根据海明不等式 2rm+r+12^r \ge m + r + 1,此时 r=2r=2,左式为 22=42^2 = 4,而右式为 8+2+1=118 + 2 + 1 = 11,由于 4<114 < 11,无法纠正一位错。
  • B [错误]:若校验位数为 3,左式为 23=82^3 = 8,而右式为 8+3+1=128 + 3 + 1 = 12,由于 8<128 < 12,无法纠正一位错。
  • C [正确]:设校验位数为 rr,数据位数 m=8m=8。若能纠正一位错,校验位数需满足海明不等式 2rm+r+12^r \ge m + r + 1。将各选项代入,当 r=4r=4 时,左式为 24=162^4 = 16,右式为 8+4+1=138 + 4 + 1 = 13,满足 161316 \ge 13,因此校验位数至少为 4。
  • D [错误]:虽然 r=5r=5 时满足 25=328+5+1=142^5 = 32 \ge 8 + 5 + 1 = 14,但题目要求的是“至少”的校验位数,因此 5 不是最小值。

2.6.10 数据校验:CRC#

Q28 (2024-2025 C卷 选择题)#

题干:CRC 校验码通过( )实现检错。 A. 多项式除法余数 B. 汉明距离 C. 奇偶统计 D. 累加和

答案:A

解析

  • A [正确]:CRC 校验将要发送的数据视为多项式的系数,并除以一个约定的生成多项式,进行模 2 除法,将得到的余数作为校验码附加在数据后面。接收端用相同的生成多项式对接收到的数据进行模 2 除法,若余数不为 0 则表示数据传输过程中发生错误。
  • B [错误]:汉明距离是指两个等长码字之间不同二进制位的个数,是用来度量某种编码的检错和纠错能力的,并非 CRC 校验的直接检错机制。
  • C [错误]:奇偶统计用于奇偶校验,通过统计数据中“1”的个数是奇数还是偶数来产生 1 位校验位,只能检测出奇数位错误,无法用于 CRC 校验。
  • D [错误]:累加和校验是通过将所有发送数据字累加并取反等操作生成校验和,不涉及多项式模 2 除法。

2.6.11 大端与小端存储#

Q29 (2020-2021 A卷 选择题)#

题干:double 变量机器码为 1122 3344 5566 7788H,小端存放,则内存地址 0000 8046H 中存放的是( )。 A. 22H B. 33H C. 77H D. 88H

答案:A

解析

  • A [正确]double 类型变量在机器中占 8 字节,本题十六进制机器码为 1122 3344 5566 7788H。小端存放的规则为“低有效字节存放在低地址内存单元”,各字节从低地址到高地址(假设从 8040H 开始)分布依次为:8040H88H8041H77H8042H66H8043H55H8044H44H8045H33H8046H22H8047H11H。因此,内存地址 0000 8046H 中存放的是 22H
  • B [错误]33H 存放在内存地址 0000 8045H 中。
  • C [错误]77H 存放在内存地址 0000 8041H 中。
  • D [错误]88H 存放在内存地址 0000 8040H 中。

Q30 (2022-2023-2 选择题)#

题干:同上题条件,问内存地址 0000 8042H 中存放的是( )。 A. 22H B. 33H C. 66H D. 88H

答案:C

解析

  • A [错误]22H 存放在内存地址 0000 8046H 中。
  • B [错误]33H 存放在内存地址 0000 8045H 中。
  • C [正确]:根据 Q29 中的小端地址字节映射分布,从低地址到高地址依次为:8040H88H8041H77H8042H66H8043H55H8044H44H8045H33H8046H22H8047H11H。因此内存地址 0000 8042H 中存放的是 66H
  • D [错误]88H 存放在内存地址 0000 8040H 中。

Q31 (2024-2025 C卷 选择题)#

题干:以下哪种存储方式将数据的最高位有效字节存储在最低地址内存单元?( ) A. 大端方式 B. 小端方式 C. 混合端方式 D. 任意方式

答案:A

解析

  • A [正确]:在大端存储方式中,数据的最高有效字节存储在最低的内存地址单元,最低有效字节则存储在最高的内存地址单元。
  • B [错误]:在小端存储方式中,数据的最低有效字节存储在最低的内存地址单元,最高有效字节存储在最高的内存地址单元。
  • C [错误]:混合端方式指字节序中大端和小端混合使用的方式,不符合将数据的最高有效字节存储在最低地址单元 of the definition.
  • D [错误]:任意方式没有固定的存储规则。

2.6.12 类型转换#

Q32 (2022-2023-2 选择题)#

题干unsigned short usi = 65535; short si = usi; 执行后 si 的值是( )。 A. -1 B. 0 C. 32767 D. -32768

答案:A

解析

  • A [正确]unsigned short 类型的变量 usi 的值为 6553565535,其对应的 16 位二进制机器码为 111111111111111121111111111111111_2。在赋值给 short si 时,其底层的二进制位模式保持不变,仍为 111111111111111121111111111111111_2。在 16 位有符号补码中,该全 1 位模式解析的真值为 1-1
  • B [错误]00 的补码是 000000000000000020000000000000000_2
  • C [错误]3276732767 的补码是 011111111111111120111111111111111_2
  • D [错误]32768-32768 的补码是 100000000000000021000000000000000_2

2.6.13 负数十进制向十六进制补码表示的转换#

Q33 (2022-2023-2 选择题 / 2024-2025 C卷)#

题干:假定一个十进制数为 66-66,按补码形式存放在一个 8 位寄存器中,该寄存器的内容用十六进制表示为( )。 A. C2H B. BEH C. BDH D. 42H

答案:B

解析

  • A [错误]C2H 对应的二进制为 11000010211000010_2,是 66-66 的原码。
  • B [正确]:十进制数 6666 的二进制表示为 01000010201000010_2。求 66-66 的补码过程为:原码为 11000010211000010_2,除符号位外各位按位取反得到反码 10111101210111101_2,反码在最低位加 1 得到补码为 10111110210111110_2。转为十六进制,高 4 位 101121011_2 对应 B\text{B},低 4 位 111021110_2 对应 E\text{E},因此该补码用十六进制表示为 BEH
  • C [错误]BDH 对应的二进制为 10111101210111101_2,是 66-66 的反码。
  • D [错误]42H 对应的二进制为 01000010201000010_2,是 +66+66 的原码、反码及补码。

2.7 典型期末练习题精选#

本节精选了练习题库中与期末考点契合度高、且最具代表性的典型题目进行详解,以供备考复习。

2.7.1 机器码概念与转换#

习题 1 (寄存器内容与移码真值判定)#

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

答案:D

解析

  • A [错误]:8 位定点整数原码 00000000 表示的真值是 +0+0,而非 128-128
  • B [错误]:8 位定点整数补码 00000000 表示的真值是 00,而非 128-128
  • C [错误]:8 位定点整数反码 00000000 表示的真值是 +0+0,而非 128-128
  • D [正确]:8 位移码的偏置值通常为 128128,移码的数值等于真值加上偏置值。因此,对于真值 128-128,其对应的移码编码为 128+128=0-128 + 128 = 0,用 8 位二进制表示即为 00000000

习题 2 (寄存器内容与有符号整数判定)#

原题:若寄存器内容为 1111 1111,若它等于 -1,则为( )。 A. 原码 B. 补码 C. 反码

答案:B

解析

  • A [错误]:8 位定点整数原码 11111111 的最高位为符号位 1 表示负数,数值位全 1 表示 127,因此真值为 127-127
  • B [正确]:8 位定点整数补码 11111111 是全 1 序列,根据补码规则,其对应的真值为 1-1
  • C [错误]:8 位定点整数反码 11111111 表示的真值是 0-0

习题 3 (机器码移码实际转换)#

原题:假设某计算机的字长为 8 位,则数 -1010110 的移码表示形式为 A. 00101010 B. 11010110 C. 10101010 D. 01010110

答案:A

解析

  • A [正确]:真值为 10101102-1010110_2(即十进制数 86-86)。其 8 位原码为 11010110211010110_2,除符号位外各位按位取反得到反码 10101001210101001_2,反码在最低位加 1 得到补码为 10101010210101010_2。移码的符号位与补码相反,其余位相同,故其移码为 00101010200101010_2
  • B [错误]11010110 为该数的原码表示。
  • C [错误]10101010 为该数的补码表示。
  • D [错误]01010110+86+86 的原码、反码及补码表示。

2.7.2 移位与类型扩展#

习题 4 (有符号数算术移位)#

原题:x = −26,用一个字节存放其补码,[x]补 = ,将 x 的补码算术左移一位为,将 x 的补码算术右移一位为____________。

解答

  1. 2626 的二进制为: 26=16+8+2=0011010226=16+8+2=0011010_2
  2. 26-26 的原码: 1,00110101,0011010
  3. 反码: 1,11001011,1100101
  4. 补码: 1,11001101,1100110
  5. 算术左移一位:符号位不变,数值位左移,右端补 0: 1,11001101,10011001,1100110 \rightarrow 1,1001100
  6. 算术右移一位:符号位不变,左端补符号位 1: 1,11001101,11100111,1100110 \rightarrow 1,1110011

答案[x]=1,1100110[x]_{\text{补}}=1,1100110,算术左移一位为 1,1001100,算术右移一位为 1,1110011

习题 5 (十六进制补码类型扩展)#

原题:16位补码0X8FA0扩展为32位应该是( )。 A. 0X0000 8FA0 B. 0XFFFF 8FA0 C. 0XFFFF FFA0 D. 0X8000 8FA0

答案:B

解析

  • A [错误]:高 16 位补 0 为零扩展,只适用于无符号数的扩展。
  • B [正确]:16 位有符号补码 0X8FA0 的最高十六进制位为 8,对应的二进制最高位(符号位)为 11(因为 8=100028 = 1000_2),表示该数是一个负数。负数补码进行有符号扩展(符号扩展)时,高位应全部填充符号位 11。16 个二进制位 1 用十六进制表示为 FFFF,因此扩展为 32 位后的结果为 0XFFFF 8FA0
  • C [错误]:低 16 位原为 8FA0,此选项将其更改为 FFA0,修改了原本的数据位,是错误的。
  • D [错误]:高位没有进行完整的符号扩展,扩展后的位不正确。

2.7.3 变形补码与溢出计算#

习题 6 (变形补码与溢出计算)#

原题:已知有符号整数[X]原=0,0101,[Y]原=1,1011,请采用双符号位的变形补码,计算[X+Y]补、[X-Y]补,分别判断是否溢出。

解答

  1. [X]=0,0101[X]_{\text{原}}=0,0101,所以: X=+01012X=+0101_2 双符号位补码为: [X]=00,0101[X]_{\text{补}}=00,0101
  2. [Y]=1,1011[Y]_{\text{原}}=1,1011,所以: Y=10112Y=-1011_2 双符号位原码为: [Y]=11,1011[Y]_{\text{原}}=11,1011 反码为: [Y]=11,0100[Y]_{\text{反}}=11,0100 补码为: [Y]=11,0101[Y]_{\text{补}}=11,0101

计算 [X+Y][X+Y]_{\text{补}}

[X+Y]=00,0101+11,0101=11,1010[X+Y]_{\text{补}}=00,0101+11,0101=11,1010

双符号位为 11,无溢出。

计算 [XY][X-Y]_{\text{补}}

  1. XY=X+(Y)X-Y=X+(-Y)
  2. 因为 Y=10112Y=-1011_2,所以: Y=+10112-Y=+1011_2
  3. [Y]=00,1011[-Y]_{\text{补}}=00,1011
  4. 相加: [XY]=00,0101+00,1011=01,0000[X-Y]_{\text{补}}=00,0101+00,1011=01,0000
  5. 双符号位为 01,表示正溢出。

答案[X+Y]=11,1010[X+Y]_{\text{补}}=11,1010,无溢出;[XY]=01,0000[X-Y]_{\text{补}}=01,0000,正溢出。


2.7.4 海明纠错码计算#

习题 7 (汉明码纠错)#

原题:已知接收到的汉明码为0100111(按配偶原则配置),试问欲传送的信息是什么?

解答

  1. 汉明码为: H1H2H3H4H5H6H7=0100111H_1H_2H_3H_4H_5H_6H_7=0100111
  2. 校验位在第 1、2、4 位: P1=H1=0,P2=H2=1,P3=H4=0P_1=H_1=0,\quad P_2=H_2=1,\quad P_3=H_4=0
  3. 数据位在第 3、5、6、7 位: D1=H3=0,D2=H5=1,D3=H6=1,D4=H7=1D_1=H_3=0,\quad D_2=H_5=1,\quad D_3=H_6=1,\quad D_4=H_7=1
  4. 偶校验下计算校验组: S1=H1H3H5H7S_1=H_1\oplus H_3\oplus H_5\oplus H_7 S1=0011=0S_1=0\oplus0\oplus1\oplus1=0 S2=H2H3H6H7S_2=H_2\oplus H_3\oplus H_6\oplus H_7 S2=1011=1S_2=1\oplus0\oplus1\oplus1=1 S3=H4H5H6H7S_3=H_4\oplus H_5\oplus H_6\oplus H_7 S3=0111=1S_3=0\oplus1\oplus1\oplus1=1
  5. 指误字为: S3S2S1=1102=6S_3S_2S_1=110_2=6
  6. 第 6 位出错,将 H6H_6 从 1 改为 0。
  7. 纠正后的汉明码为: 01001010100101
  8. 取数据位第 3、5、6、7 位: D1D2D3D4=0101D_1D_2D_3D_4=0101

答案:欲传送的信息为 0101


习题2:课后习题详解#

以下为本章教材配属的全部课后习题及详细解答。

课后习题1 课后习题2 课后习题3


习题2.1 解释下列名词#

名词详细物理与学术解释
真值机器数所表示的实际数学数值,如机器码 11111111 若按 8 位补码解释,其代表的实际真值为 -1。
机器码数据在计算机内部实际存储和运算时的二进制编码形态。
原码最高位为符号位(正数用 0,负数用 1),其余各位用于表示该数数值的绝对值。
反码正数的反码与其原码相同;负数的反码则是其符号位保持不变,其余各位数值按位取反。
补码正数的补码与其原码相同;负数的补码则是其反码在最低位加 1。是现代计算机表示带符号整数的主流编码方式。
移码将真值加上一个固定的偏移量(偏置值)后得到的机器码,常用于浮点数的阶码表示,方便硬件比对阶码大小。
编码系统的最大循环量。如 8 位二进制补码系统的模为 256。
定点数小数点位置固定不变的机器数,主要用于表示纯整数或纯小数。
浮点数小数点位置可以浮动的机器数,常表示为科学记数法形式,包含尾数和阶码两部分。
溢出运算结果超出了机器字长所能表示的最大数值范围,包括正上溢和负下溢。
精度溢出运算结果的有效位数超出了机器所能保留的最大精度位,需要进行舍入或截断处理。
浮点数规格化通过调整尾数数值与阶码大小,使尾数最高有效位满足特定要求(如补码浮点数要求数符与尾数最高数值位异号),从而保证表示形式的唯一性。
隐藏位在单精度和双精度浮点规格化表示中,尾数第一位必须为 1。该 1 在物理上被省略不存储,从而腾出 1 位用于增加精度。
BCD码用二进制编码来表示十进制数码 0 至 9 的二进制编码方式。
有权码二进制编码的每一位均被赋予固定权值的编码(例如 8421 编码)。
无权码二进制编码中各位均没有固定权值的编码方式(例如余 3 码)。
BID码二进制整型十进制表示法,是十进制浮点数的一种有效数值编码机制。
DPD码高密度十进制压缩法,是十进制浮点数中用于高密度存储十进制数据的一种编码机制。
二进制浮点数基数为 2 的浮点数编码,如单精度浮点数。
十进制浮点数基数为 10 的浮点数编码,适用于金融、税务等不允许二进制转换精细舍入误差的计算场景。
ASCII码采用 7 位二进制来编码表示英文字符、数字及控制字符的通用标准编码。
机内码字符在计算机内部存储和传输时所使用的编码。
字形码描述字形点阵或轮廓的数据,用于字符的显示与打印输出。
字库存储所有字符字形码的物理字形点阵集合。
码距编码系统中任意两个合法码字之间不同二进制位的最小个数,决定了检错和纠错的能力。
校验码通过在有效数据位后附加多余的冗余位,用以在数据传输或存储中发现或纠正错误的编码。
多重奇偶校验引入多个不同方向的奇偶校验机制,如水平偶校验与垂直偶校验结合,从而提高定位错误的能力。
ECC码纠错码,是一种能够自动检测并定位、纠正错误的校验编码方式。
海明码一种具有纠正一位错误、检测两位错误能力的线性分组校验码。
CRC码循环冗余校验码,利用多项式模 2 除法的余数作为校验位,检错能力极强。

习题2.2 选择题(考研真题)#

( 1 ) 由 3 个“1”和 5 个“0”组成的 8 位二进制补码,能表示的最小整数是________。#

A. 126-126 B. 125-125 C. 32-32 D. 3-3

答案:B

解析

  • A [错误]126-126 的 8 位补码表示为 10000010210000010_2,其中有 2 个 1 和 6 个 0,不符合题干中的数量条件。
  • B [正确]:8 位补码定点数对应的真值计算式为 X=128×x7+i=06xi2iX = -128 \times x_7 + \sum_{i=0}^{6} x_i 2^i。要使真值最小,必须使符号位为 1。符号位确定为 1 后,剩下 2 个 1 和 5 个 0 可以在低 7 位中进行分配。为了让真值尽可能小,低 7 位的无符号数值应尽可能小,即把剩下的 2 个 1 放在最低的两位,得到机器码 10000011210000011_2。其对应的真值为 128+21+20=125-128 + 2^1 + 2^0 = -125
  • C [错误]32-32 的 8 位补码表示为 11100000211100000_2,虽然包含 3 个 1 和 5 个 0,但其真值大于 125-125,不是该编码组合能表示的最小整数。
  • D [错误]3-3 的 8 位补码表示为 11111101211111101_2,其中有 7 个 1 和 1 个 0,不符合条件。

( 2 ) 32 位补码所能表示的整数范围是________。#

A. 2322311-2^{32} \sim 2^{31}-1 B. 2312311-2^{31} \sim 2^{31}-1 C. 2322321-2^{32} \sim 2^{32}-1 D. 2312321-2^{31} \sim 2^{32}-1

答案:B

解析

  • A [错误]232-2^{32} 超出了 32 位补码能表示的最小值。
  • B [正确]nn 位补码的数值范围公式为 2n12n11-2^{n-1} \sim 2^{n-1}-1。将 n=32n=32 代入公式可得其范围为 2312311-2^{31} \sim 2^{31}-1
  • C [错误]:此范围不是 32 位有符号整数的表示范围。
  • D [错误]:正数范围上限 23212^{32}-1 是 32 位无符号整数的上限,而非补码的上限。

( 3 ) 已知带符号整数用补码表示,变量 x,y,zx, y, z 的机器数分别为 FFFDH\text{FFFDH}FFDFH\text{FFDFH}7FFCH\text{7FFCH},下列结论中,正确的是________。#

A. 若 x,yx, yzz 为无符号整数,则 z<x<yz < x < y B. 若 x,yx, yzz 为无符号整数,则 x<y<zx < y < z C. 若 x,yx, yzz 为带符号整数,则 x<y<zx < y < z D. 若 x,yx, yzz 为带符号整数,则 y<x<zy < x < z

答案:D

解析

  • A [错误]:若作为无符号数解释,FFFDH=65533\text{FFFDH} = 65533FFDFH=65503\text{FFDFH} = 655037FFCH=32764\text{7FFCH} = 32764,因此无符号下的大小关系为 z<y<xz < y < x
  • B [错误]:由于无符号大小关系为 z<y<xz < y < x,此排序错误。
  • C [错误]:若作为有符号整数补码解释,x=FFFDHx = \text{FFFDH} 最低有效位为 1 且符号位为 1,其真值为 3-3y=FFDFHy = \text{FFDFH} 的符号位为 1,其真值为 33-33z=7FFCHz = \text{7FFCH} 的符号位为 0,其真值为 3276432764。因此,有符号大小关系为 y<x<zy < x < z
  • D [正确]:根据计算得到的真值大小排序,满足 y(33)<x(3)<z(32764)y(-33) < x(-3) < z(32764)

( 4 ) 若 short 型变量 x=8190x = -8190,则 xx 的机器数是________。#

A. E002H\text{E002H} B. E001H\text{E001H} C. 9FFFH\text{9FFFH} D. 9FFEH\text{9FFEH}

答案:A

解析

  • A [正确]short 占 16 位。数值绝对值 8190=2132=0001 1111 1111 111028190 = 2^{13} - 2 = 0001 \ 1111 \ 1111 \ 1110_2。求 8190-8190 的补码:原码为 1001 1111 1111 111021001 \ 1111 \ 1111 \ 1110_2,除符号位外各位取反得反码 111021110 \dots_2。因反码为 1110 0000 0000 000121110 \ 0000 \ 0000 \ 0001_2,再加 1 得到补码为 1110 0000 0000 001021110 \ 0000 \ 0000 \ 0010_2,转换为十六进制即为 E002H
  • B [错误]E001H 对应的真值为 8191-8191
  • C [错误]9FFFH 对应的真值为 24577-24577,非 8190-8190 的位模式。
  • D [错误]9FFEH 对应的真值为 24578-24578

( 5 ) 考虑以下 C 语言代码:#

unsigned short usi=65535;
short si=usi;

执行上述程序段后,si\text{si} 的值是________。 A. 1-1 B. 32767-32767 C. 32768-32768 D. 65535-65535

答案:A

解析

  • A [正确]usi 值为 65535,其 16 位无符号数二进制形式为全 1,即 FFFFH。将 usi 赋值给有符号短整型 si 时,底层进行位拷贝,si 也是 FFFFH。16 位有符号数补码 FFFFH 解析对应的真值为 1-1
  • B [错误]32767-32767 的 16 位有符号补码为 8001H
  • C [错误]32768-32768 的 16 位有符号补码为 8000H
  • D [错误]65535-65535 超出 16 位有符号整数的表示范围。

( 6 ) 假定编译器规定 int 和 short 类型长度分别为 32 位和 16 位,执行下列 C 语言语句:#

unsigned short x=65530;
unsigned int y=x;

得到 y\text{y} 的机器数为________。 A. 0000 7FFAH\text{0000 7FFAH} B. 0000 FFFAH\text{0000 FFFAH} C. FFFF 7FFAH\text{FFFF 7FFAH} D. FFFF FFFAH\text{FFFF FFFAH}

答案:B

解析

  • A [错误]:低 16 位变为了 7FFAH,与原本的值 FFFAH 不符。
  • B [正确]:变量 xx 值为 65530,对应的 16 位十六进制为 FFFAH。由于 xxunsigned short,将其转换为 unsigned int 时进行零扩展,在高 16 位填充 0,得到 32 位机器数为 0000 FFFAH
  • C [错误]:低位发生了改变,且高位填充不正确。
  • D [错误]:高位填充为 FFFF 是符号扩展的结果,一般用于有符号整型的数据类型转换。

( 7 ) 有如下 C 语言程序段:short si=-32767; unsigned short usi=si; 执行上述两条语句后,usi\text{usi} 的值为________。#

A. 32767-32767 B. 3276732767 C. 3276832768 D. 3276932769

答案:D

解析

  • A [错误]usi 为无符号数,无法表示负数。
  • B [错误]3276732767 的二进制无符号表示是 7FFFH
  • C [错误]3276832768 的二进制无符号表示是 8000H
  • D [正确]:变量 si=32767si = -32767 的 16 位有符号补码表示为 32767+65536=32769=8001H-32767 + 65536 = 32769 = \text{8001H}。赋值给无符号类型的 usi 时进行位拷贝,使其机器数为 8001H,按无符号数解析对应的真值即为 3276932769

( 8 ) C 语言代码如下:#

int i = 32777;
short si = i;
int j = si;

执行后 j\text{j} 的真值为________。 A. 32777-32777 B. 32759-32759 C. 3275932759 D. 3277732777

答案:B

解析

  • A [错误]:真值不可能是 32777-32777
  • B [正确]:变量 i=32777=0000 8009Hi = 32777 = \text{0000 8009H}。转换为 16 位 short 类型时被直接截断保留低 16 位,即 8009H。有符号补码 8009H 的最高位为 1,真值计算为 32768+9=32759-32768 + 9 = -32759。赋值给 int j 时进行符号扩展,因为是符号扩展,其真值保持不变,仍为 32759-32759
  • C [错误]3275932759 的 16 位补码是 7FF7H,截断后的机器码为 8009H,符号位为 1,故真值为负数。
  • D [错误]:经过有符号短整型的截断之后,数据发生了溢出,不能恢复为原值 3277732777

( 9 ) 下列数值中,不能用 IEEE 754 浮点格式精确表示的是________。#

A. 1.21.2 B. 1.251.25 C. 2.02.0 D. 2.52.5

答案:A

解析

  • A [正确]:二进制浮点数能够精确表示的十进制小数其分母必须能写成 2 的整数次幂。1.2=651.2 = \frac{6}{5},分母中含有非 2 的因子 5,因此将其转换为二进制时为无限循环小数,无法精确表示。
  • B [错误]1.25=54=5221.25 = \frac{5}{4} = \frac{5}{2^2},可以精确表示为二进制小数 1.0121.01_2
  • C [错误]2.0=212.0 = 2^1,可以精确表示。
  • D [错误]2.5=52=5212.5 = \frac{5}{2} = \frac{5}{2^1},可以精确表示为二进制小数 10.1210.1_2

( 10 ) float 型数据通常用 IEEE 754 单精度浮点数格式表示。若编译器将 float 型变量 xx 分配在一个 32 位浮点寄存器 FR1 中,且 x=8.25x = -8.25,则 FR1 的内容是________。#

A. C104 0000H\text{C104 0000H} B. C242 0000H\text{C242 0000H} C. C184 0000H\text{C184 0000H} D. C1C2 0000H\text{C1C2 0000H}

答案:C

解析

  • A [错误]:阶码字段正确但尾数字段表示的值不对。
  • B [错误]:阶码部分计算错误。
  • C [正确]:绝对值 8.25=1000.012=1.000012×238.25 = 1000.01_2 = 1.00001_2 \times 2^3。因为是负数,所以符号位 S=1S = 1;阶码字段 E=3+127=130=100000102E = 3 + 127 = 130 = 10000010_2;尾数字段 MM 去掉规格化隐藏位 1 并补 0 后得到 000010020000100\dots_2。拼接得到二进制机器码:1  10000010  000010000000000000000002    C184 0000H1 \ | \ 10000010 \ | \ 00001000000000000000000_2 \implies \text{C184 0000H}
  • D [错误]:拼接出的机器码值不正确。

( 11 ) 某数采用 IEEE 754 单精度浮点数格式表示为 C640 0000H\text{C640 0000H},则该数的值是________。#

A. 1.5×213-1.5 \times 2^{13} B. 1.5×212-1.5 \times 2^{12} C. 0.5×213-0.5 \times 2^{13} D. 0.5×212-0.5 \times 2^{12}

答案:A

解析

  • A [正确]:将十六进制机器码 C640 0000H 展开为二进制串:1  10001100  1000000000000000000000021 \ | \ 10001100 \ | \ 10000000000000000000000_2。解析各字段可知:符号位 S=1S=1 代表负数;阶码字段 E=140E = 140,真实阶码 e=140127=13e = 140 - 127 = 13;尾数字段为 0.120.1_2,加上规格化隐藏位 1 后有效值为 1.12=1.51.1_2 = 1.5。代入公式得到值为 1.5×213-1.5 \times 2^{13}
  • B [错误]:阶码计算错误,真实阶码应为 13。
  • C [错误]:尾数有效值计算错误,未加上规格化隐藏位 1。
  • D [错误]:阶码与尾数均计算错误。

( 12 ) float 型能表示的最大正整数是________。#

A. 212621032^{126}-2^{103} B. 212721042^{127}-2^{104} C. 212721032^{127}-2^{103} D. 212821042^{128}-2^{104}

答案:D

解析

  • A [错误]:对应阶码较小,非最大有效阶码。
  • B [错误]:对应阶码字段未取到最大值。
  • C [错误]:尾数部分的最大值及减项计算不正确。
  • D [正确]:在单精度浮点数中,最大有效阶码字段值为 254,对应真实阶码 e=254127=127e = 254 - 127 = 127。尾数字段最大为全 1,对应最大有效值为 22232 - 2^{-23}。因此单精度浮点数能表示的最大规格化正数为 (2223)×2127=21282104(2 - 2^{-23}) \times 2^{127} = 2^{128} - 2^{104}

( 13 ) IEEE 754 单精度浮点格式表示的数中,最小规格化正数是________。#

A. 1.0×21261.0 \times 2^{-126} B. 1.0×21271.0 \times 2^{-127} C. 1.0×21281.0 \times 2^{-128} D. 1.0×21491.0 \times 2^{-149}

答案:A

解析

  • A [正确]:规格化单精度浮点数的最小阶码字段值为 1,对应的真实指数 e=1127=126e = 1 - 127 = -126。尾数字段取其最小值全 0,加上规格化隐藏位 1 后为 1.0。因此最小规格化正数为 1.0×21261.0 \times 2^{-126}
  • B [错误]:阶码字段转换为真实指数的计算不正确,应为 126-126
  • C [错误]:阶码字段为 0 时表示非规格化数,非规格化数不属于规格化数的范畴。
  • D [错误]:这是非规格化数能表示的最小正数,而非规格化正数。

( 14 ) float 型数据通常用 IEEE 754 单精度浮点格式表示。假定两个 float 型变量 xxyy 分别存放在 32 位寄存器 f1\text{f1}f2\text{f2} 中,若 (f1)=CC90 0000H(\text{f1}) = \text{CC90 0000H}(f2)=B0C0 0000H(\text{f2}) = \text{B0C0 0000H},则 xxyy 之间的关系为________。#

A. x<yx < y 且符号相同 B. x<yx < y 且符号不同 C. x>yx > y 且符号相同 D. x>yx > y 且符号不同

答案:A

解析

  • A [正确]:由 (f1)=CC90 0000H(\text{f1}) = \text{CC90 0000H} 可知其最高位(符号位)为 1,为负数;由 (f2)=B0C0 0000H(\text{f2}) = \text{B0C0 0000H} 可知其最高位(符号位)为 1,也是负数。两者符号相同。xx 的阶码字段为 153153yy 的阶码字段为 9797。因为 xx 的阶码大于 yy,说明 xx 的绝对值大于 yy,而两者都为负数,因此真值关系为 x<yx < y
  • B [错误]:两者均为负数,符号相同。
  • C [错误]xx 的绝对值大于 yy,在都为负数时,xx 的数值更小。
  • D [错误]:两者符号相同且 x<yx < y

( 15 ) 假定变量 i,f,di, f, d 的数据类型分别为 int、float、double,已知 i=785i = 785f=1.5678e3f = 1.5678\text{e3}d=1.5e100d = 1.5\text{e100},若在 32 位计算机中执行下列关系表达式,则结果为真的有________。#

Ⅰ. i == (int)(float)i Ⅱ. f == (float)(int)f Ⅲ. f == (float)(double)f Ⅳ. (d+f)-d == f A. 仅 Ⅰ、Ⅱ B. 仅 Ⅰ、Ⅲ C. 仅 Ⅱ、Ⅲ D. 仅 Ⅲ、Ⅳ

答案:B

解析

  • A [错误]:包含命题 Ⅱ,但 Ⅱ 为假。
  • B [正确]:对各命题分析如下:
    • Ⅰ. 785<224785 < 2^{24},单精度浮点数尾数可以精确表示 2242^{24} 以内的所有整数,因此 ii 转换为 float 精度无损,再转回 int 值不变,命题 Ⅰ 为真。
    • Ⅱ. f=1567.8f = 1567.8,转换为 int 时发生截断丢失小数部分变为 15671567,再转回 float1567.01567.0,不等于原值,命题 Ⅱ 为假。
    • Ⅲ. float 类型转换为 double 为精度扩充转换,无损,转回 float 仍相等,命题 Ⅲ 为真。
    • Ⅳ. d=1.5×10100d = 1.5 \times 10^{100},而 f=1567.8f = 1567.8。由于 dd 的阶码远大于 ff,在执行 d+fd+f 对阶时, ff 的尾数会向右移出导致其有效位全部丢失,出现大数吃小数现象,使得 d+f=dd+f = d。因此 (d+f)d=dd=0(d+f)-d = d-d = 0,与 ff 不相等,命题 Ⅳ 为假。 综上分析,结果为真的有 Ⅰ 和 Ⅲ。
  • C [错误]:未包含命题 Ⅰ,且包含假的命题 Ⅱ。
  • D [错误]:包含假的命题 Ⅳ。

( 16 ) 已知带符号整数用补码表示,float 型数据用 IEEE 754 标准表示,假定变量 xx 的类型只能是 int 或 float,当 xx 的机器数为 C8000000H\text{C8000000H} 时,xx 的值可能是________。#

A. 7×227-7 \times 2^{27} B. 216-2^{16} C. 2172^{17} D. 25×22725 \times 2^{27}

答案:A

解析

  • A [正确]:如果 xxint 类型,机器数 C8000000H 对应的 32 位有符号补码其最高位为 1,是负数,真值为 C8000000H232=939524096=7×227\text{C8000000H} - 2^{32} = -939524096 = -7 \times 2^{27}。若 xxfloat 类型,机器数 C8000000H 对应的二进制中,符号位为 1,阶码字段为 144144,真实指数 e=144127=17e = 144 - 127 = 17,尾数全 0,对应的值为 1.0×217=217-1.0 \times 2^{17} = -2^{17}。选项中没有 217-2^{17},因此 xx 只能是 int 类型,值为 7×227-7 \times 2^{27}
  • B [错误]:浮点数解释下对应的真实指数为 17,计算出的值为 217-2^{17}
  • C [错误]:浮点数解释下最高符号位为 1,应该为负数。
  • D [错误]:整型解释下最高位为 1,真值应该为负数,不能是正数。

( 17 ) 0.4375-0.4375 的 IEEE 754 单精度浮点数表示为________。#

A. BEE0 0000H\text{BEE0 0000H} B. BF60 0000H\text{BF60 0000H} C. BF70 0000H\text{BF70 0000H} D. C0E0 0000H\text{C0E0 0000H}

答案:A

解析

  • A [正确]0.4375-0.4375 绝对值对应的二进制为 0.01112=1.112×220.0111_2 = 1.11_2 \times 2^{-2}。符号位 S=1S = 1;阶码字段 E=2+127=125=011111012E = -2 + 127 = 125 = 01111101_2;尾数字段 MM 去掉规格化隐藏位 1 并补 0 后为 11000000000000000000000211000000000000000000000_2。拼接得到机器码为 1  01111101  110000000000000000000002    BEE0 0000H1 \ | \ 01111101 \ | \ 11000000000000000000000_2 \implies \text{BEE0 0000H}
  • B [错误]:阶码和尾数值与计算出来的结构不相符。
  • C [错误]:阶码计算不正确。
  • D [错误]:指数和符号表示有误。

( 18 ) 已知 float 型变量用 IEEE 754 单精度浮点数格式表示。若 float 型变量 xx 的机器数为 8020 0000H8020\ 0000\text{H},则 xx 的值是________。#

A. 2128-2^{-128} B. 1.01×2127-1.01 \times 2^{-127} C. 1.01×2126-1.01 \times 2^{-126} D. 非数(NaN)

答案:A

解析

  • A [正确]:机器数 8020 0000H 对应的二进制串符号位为 1,阶码字段为全 0,尾数字段为 0x200000(非全 0),因此是非规格化数。非规格化数的真实指数固定为 126-126,尾数无隐藏位 1,尾数值为 0x200000223=22\frac{\text{0x200000}}{2^{23}} = 2^{-2}。代入非规格化数公式得到其值为 22×2126=2128-2^{-2} \times 2^{-126} = -2^{-128}
  • B [错误]:计算中不应包含隐藏位 1,指数值也计算错误。
  • C [错误]:尾数和指数计算均不正确。
  • D [错误]:NaN 要求阶码字段为全 1,而本题阶码字段为全 0。

( 19 ) 某科学实验需要使用大量整型参数,为了在保证数据精度的基础上提高运算速度,需要选择合理的数据表示方法。若整型参数 α\alphaβ\beta 的取值范围分别为 220220-2^{20} \sim 2^{20}240240-2^{40} \sim 2^{40}α\alphaβ\beta 最适宜采用________。#

A. 32 位整数、32 位整数 B. 单精度浮点数、单精度浮点数 C. 32 位整数、双精度浮点数 D. 单精度浮点数、双精度浮点数

答案:C

解析

  • A [错误]β\beta 的范围超出了 32 位整数所能表示的最大范围。
  • B [错误]:单精度浮点数尾数有效精度只有 24 位,表示绝对值较大的整数(如 2402^{40})时无法做到完全精确,会发生精度丢失。
  • C [正确]α\alpha 的取值范围在 32 位有符号整数的表示范围内,使用 32 位整数表示可以在没有精度损失的同时提供最高效的硬件执行速度。β\beta 范围超出 32 位有符号整数上限,但双精度浮点数拥有 53 位尾数有效精度,完全可以无损地精确表示该范围内的所有连续整数。因此,α\alpha 用 32 位整数,β\beta 用双精度浮点数最为适宜。
  • D [错误]α\alpha 在 32 位整数表示范围中,整数运算性能优于浮点数,用单精度浮点数会增加不必要的性能开销。

( 20 ) 用海明码对长度为 8 位的数据进行检错和纠错时,若能纠正一位错,则校验位数至少为________。#

A. 2 B. 3 C. 4 D. 5

答案:C

解析

  • A [错误]:校验位数为 2 时,代入海明不等式不成立。
  • B [错误]:校验位数为 3 时,代入海明不等式不成立。
  • C [正确]:设数据位数 m=8m=8,校验位数为 rr。根据能纠正一位错的海明不等式 2rm+r+12^r \ge m + r + 1,将各选项代入:当 r=4r=4 时,左式为 24=162^4 = 16,右式为 8+4+1=138 + 4 + 1 = 13,不等式满足且 r=4r=4 是使不等式成立的最小值。因此校验位数至少为 4。
  • D [错误]:虽然 5 也能使不等式成立,但并非题目要求的至少需要的位数。

习题2.3 简答题#

( 1 ) 为什么计算机中采用二进制进行数据表示和运算?#

解答

  • 物理上易于实现:具有两种稳定物理状态的电子器件极易寻找且抗干扰性能强。
  • 运算规则简单:二进制的算术加减乘除运算法则极少,硬件结构大为简化。
  • 逻辑运算契合:二进制的 0 和 1 恰好能与布尔代数中的“假”与“真”无缝契合,便于逻辑门电路的实现。

( 2 ) 相对于奇偶校验,交叉奇偶校验的检错与纠错能力的提高需要付出哪些方面的代价?#

解答

  • 冗余开销增大:交叉奇偶校验同时增加了水平和垂直校验位,使得非数据位的传输和存储开销显著增加。
  • 硬件与算法变复杂:编码与译码检测电路在硬件实现上面临更多的逻辑门,延迟变大。
  • 数据组织要求高:需要对数据进行行、列的矩阵化块状存取,增加了数据调度的开销。

( 3 ) 为什么计算机中采用补码表示带符号的整数?#

解答

  • 统一加减法运算:通过求补码可以将减法操作巧妙化为加法操作,从而无需设计减法器,简化了运算器设计。
  • 符号位参与计算:符号位与数值位能够共同参与运算,不需要单独的逻辑判定符号。
  • 0 的表示唯一:消除了原码和反码中正 0 和负 0 的歧义。

( 4 ) 浮点数的表示范围和精度分别由什么决定?#

解答

  • 表示范围:主要由浮点数中的阶码位数(以及指数所选用的基数和偏置值)来决定。阶码位宽越宽,所能跨越的数轴范围越大。
  • 表示精度:主要由浮点数中的尾数位数(以及是否有隐藏位和所采用的舍入控制模式)决定。尾数位宽越宽,其保留的有效数字位数越多,精度越高。

( 5 ) 汉字输入码、机内码和字形码在汉字处理过程中各有什么作用?#

解答

  • 输入码:用于从键盘将汉字输入至计算机内部,解决字形到拼音/字形码的转换。
  • 机内码:用于汉字在计算机系统内部的存取、加工、编辑和网络传输交换。
  • 字形码:用于将计算机内部处理后的机内码汉字转变为物理输出点阵,以显示或打印汉字。

( 6 ) 在机内码中如何区分 ASCII 字符和汉字字符?#

解答: 在国标类编码(如 GB2312、GBK)中,通过最高位来做区分:

  • ASCII 字符:使用单字节表示,其最高有效位固定为 0。
  • 汉字字符:使用双字节表示,且两个字节的最高位均固定为 1。 计算机读取字节时,若检测到最高位为 1,则与下一个最高位为 1 的字节拼接成一个汉字;若最高位为 0,则单独作为一个 ASCII 码处理。

( 7 ) 为什么现代处理器中又开始支持十进制浮点数运算?#

解答: 二进制浮点数在表示许多常用的十进制有限小数(如 0.1, 0.01 等)时会转化为二进制无限循环小数,导致计算中累积微小的舍入误差。这在金融、会计、税收等要求数值精确对齐的业务场景中是不可接受的。现代处理器加入十进制浮点数运算,能够从底层消除二-十进制转换带来的舍入损失,确保十进制精度。

( 8 ) 如何识别浮点数的正负?浮点数能表示的数值范围和数值的精度取决于什么?#

解答

  • 正负识别:由浮点数机器码的最高位(即符号位 SS)识别,S=0S=0 代表正数,S=1S=1 代表负数。
  • 数值范围:取决于阶码的位数(决定最大/最小指数)。
  • 数值精度:取决于尾数的位数及是否包含隐藏位。

( 9 ) 浮点数有两个 0 会带来什么问题?#

解答

  • 表示不唯一+0+00-0 二进制不同,破坏了表示的唯一性。
  • 极限与倒数歧义:会导致除 0 运算产生歧义(如 1+0=+\frac{1}{+0} = +\infty10=\frac{1}{-0} = -\infty)。
  • 比较分支逻辑复杂:在硬件比较器和数学函数运算中,必须加入额外的判定逻辑对符号进行特殊处理。

( 10 ) 简述 CRC 校验码的检错原理,CRC 能纠错吗?#

解答

  • 检错原理:发送端在数据后追加 rr 个 0 后与生成多项式对应的无符号二进制数做模 2 除法,所得的余数即为校验码,并替换原追加的 0 发送。接收端用相同的生成多项式对接收到的编码做模 2 除法,若余数为 0 说明传输无误,若余数非 0 说明出错。
  • 纠错能力:CRC 主要用于高效率的检错。在一般的多位错场景下它无法定位具体错误,不具备纠错能力;但如果在仅发生单比特错误的严格假设下,可以通过建立综合余数表来定位具体的出错位,进而通过取反实现纠错。

习题2.4 写出下列各数的原码、反码和补码#

原题:写出下列各数的原码、反码和补码。 0, 0, 0.10101, 0.10101, 0.11111, 0.11111, 0.10000, 0.100000,\ -0,\ 0.10101,\ -0.10101,\ 0.11111,\ -0.11111,\ -0.10000,\ 0.10000

解答: 在定点小数表示法中(含 1 位符号位,5 位数值位),各真值的表示情况如下表所示:

真值原码反码补码
000.000000.000000.000000.000000.000000.00000
0-01.000001.000001.111111.111110.000000.00000
0.101010.101010.101010.101010.101010.101010.101010.10101
0.10101-0.101011.101011.101011.010101.010101.010111.01011
0.111110.111110.111110.111110.111110.111110.111110.11111
0.11111-0.111111.111111.111111.000001.000001.000011.00001
0.10000-0.100001.100001.100001.011111.011111.100001.10000
0.100000.100000.100000.100000.100000.100000.100000.10000

习题2.5 已知数的补码表示形式,求数的真值#

原题:已知数的补码表示形式,求数的真值。 [x]=0.10010,[x]=1.10010,[x]=1.11111[x]_{\text{补}} = 0.10010,\quad [x]_{\text{补}} = 1.10010,\quad [x]_{\text{补}} = 1.11111 [x]=1.00000,[x]=0.10001,[x]=1.00001[x]_{\text{补}} = 1.00000,\quad [x]_{\text{补}} = 0.10001,\quad [x]_{\text{补}} = 1.00001

解答: 补码定点小数(1 位符号位,5 位数值位)求真值的逻辑如下:

  1. [x]=0.10010[x]_{\text{补}} = 0.10010: 符号位为 0(正数),原码等同,真值为 +0.100102=+0.5625+0.10010_2 = +0.5625
  2. [x]=1.10010[x]_{\text{补}} = 1.10010: 符号位为 1(负数)。求原码需除符号位外取反加 1:数值位 1001010010 取反得 0110101101,加 1 得原码为 1.0111021.01110_2。真值为 0.011102=0.4375-0.01110_2 = -0.4375
  3. [x]=1.11111[x]_{\text{补}} = 1.11111: 符号位为 1。求原码:数值位全 1 取反为全 0,加 1 得原码 1.0000121.00001_2。真值为 0.000012=0.03125-0.00001_2 = -0.03125
  4. [x]=1.00000[x]_{\text{补}} = 1.00000: 符号位为 1,数值部分全为 0。这是补码负数表示的极限值,真值为 1-1
  5. [x]=0.10001[x]_{\text{补}} = 0.10001: 符号位为 0(正数),真值为 +0.100012=+0.53125+0.10001_2 = +0.53125
  6. [x]=1.00001[x]_{\text{补}} = 1.00001: 符号位为 1。求原码:数值位 0000100001 取反得 1111011110,加 1 得原码 1.1111121.11111_2。真值为 0.111112=0.96875-0.11111_2 = -0.96875

习题2.6 无符号数与有符号整数的 C 语言转换分析#

原题:C 语言中允许无符号数和有符号整数之间的转换,下面是一段 C 语言代码。

int x = -1;
unsigned u = 2147483648;
printf("x=%u=%d\n", x, x);
printf("u=%u=%d\n", u, u);

给出在 32 位计算机上上述程序段的输出结果并分析原因。

解答: 在 32 位计算机上,上述程序段的运行输出结果为:

x=4294967295=-1
u=2147483648=-2147483648

原因分析

  1. 对于变量 xx
    • x=1x = -1 是 32 位带符号整型,其内存底层的二进制补码存储为全 1,即 FFFF FFFFH
    • 当以 %u(无符号十进制)格式打印时,将该 FFFF FFFFH 解析为无符号数,值即为 2321=42949672952^{32} - 1 = 4294967295
    • 当以 %d(有符号十进制)格式打印时,将其正常解析为补码负数,值即为 1-1
  2. 对于变量 uu
    • u=2147483648=231u = 2147483648 = 2^{31},是 32 位无符号整型,其内存存储为 8000 0000H
    • 当以 %u(无符号十进制)格式打印时,正常解析无符号,值为 21474836482147483648
    • 当以 %d(有符号十进制)格式打印时,由于最高位为 1,被解析为有符号补码负数,其为 32 位有符号补码能表示的极限负数,真值即为 231=2147483648-2^{31} = -2147483648

习题2.7 分析几种情况下所能表示的数据范围#

原题:分析下列几种情况下所能表示的数据范围分别是多少。 ( 1 ) 16 位无符号数; ( 2 ) 16 位原码定点小数; ( 3 ) 16 位补码定点小数; ( 4 ) 16 位补码定点整数。

解答

  • ( 1 ) 16 位无符号数: 全无符号,表示范围为:021610 \sim 2^{16} - 1,即 0655350 \sim 65535
  • ( 2 ) 16 位原码定点小数: 1 位符号位,15 位数值位。最大正数为 0.11112=12150.111\dots1_2 = 1 - 2^{-15};最小负数为 1.11112=(1215)1.111\dots1_2 = -(1 - 2^{-15})。 范围为:(1215)+(1215)-(1 - 2^{-15}) \sim +(1 - 2^{-15})
  • ( 3 ) 16 位补码定点小数: 1 位符号位,15 位数值位。由于补码 0 的表示唯一,负数比正数多表示一个边界负值 1-1。 范围为:11215-1 \sim 1 - 2^{-15}
  • ( 4 ) 16 位补码定点整数: 1 位符号位,15 位数值位。 范围为:2152151-2^{15} \sim 2^{15} - 1,即 32768+32767-32768 \sim +32767

习题2.8 补码表示整数的模#

原题:用补码表示二进制整数,机器码为 x0x1x2x3x4x5x6x7x_0x_1x_2x_3x_4x_5x_6x_7x0x_0 为符号位,补码的模为多少?

解答: 补码的“模”代表了该计数系统所能表征的最大数值环边界。该机器码共有 8 位二进制(含 1 位符号位),其所能代表的编码状态共有 28=2562^8 = 256 个。 因此,该 8 位补码系统的模为 256(或记为 282^8)。


习题2.9 采用 IEEE 754 32 位单精度标准表示十进制数#

原题:用 IEEE 754 32 位单精度浮点数标准表示下列十进制数。 ( 1 ) 658-6\frac{5}{8}; ( 2 ) 3.14159273.1415927; ( 3 ) 6400064000

解答

  • ( 1 ) 十进制数 658-6\frac{5}{8}
    • 绝对值二进制:6.625=110.10126.625 = 110.101_2
    • 规格化:1.101012×221.10101_2 \times 2^2,指数 e=2e = 2
    • 各字段编码:负数符号位 S=1S = 1;阶码字段 E=2+127=129=100000012E = 2 + 127 = 129 = 10000001_2;尾数字段 M=10101002M = 1010100\dots_2
    • 拼接为:1  10000001  101010000000000000000002    C0D4 0000H1 \ | \ 10000001 \ | \ 10101000000000000000000_2 \implies \text{C0D4 0000H}
  • ( 2 ) 十进制数 3.14159273.1415927
    • 绝对值二进制:经过精确的基二转换并规格化,得规格化前为 11.0010010000111111011011211.0010010000111111011011\dots_2
    • 规格化形式为 1.100100100001111110110112×211.10010010000111111011011_2 \times 2^1
    • 各字段编码:正数 S=0S = 0;阶码 E=1+127=128=100000002E = 1 + 127 = 128 = 10000000_2;尾数舍入后为 M=100100100001111110110112M = 10010010000111111011011_2
    • 拼接为:0  10000000  100100100001111110110112    4049 0FDBH0 \ | \ 10000000 \ | \ 10010010000111111011011_2 \implies \text{4049 0FDBH}
  • ( 3 ) 十进制数 6400064000
    • 绝对值二进制:64000=1111 1010 0000 0000264000 = 1111 \ 1010 \ 0000 \ 0000_2
    • 规格化:1.1111012×2151.111101_2 \times 2^{15}
    • 各字段编码:正数 S=0S = 0;阶码 E=15+127=142=100011102E = 15 + 127 = 142 = 10001110_2;尾数 M=111101000000000000000002M = 11110100000000000000000_2
    • 拼接为:0  10001110  111101000000000000000002    477A 0000H0 \ | \ 10001110 \ | \ 11110100000000000000000_2 \implies \text{477A 0000H}

习题2.10 单精度浮点数还原真值#

原题:求与单精度浮点数 43940000H\text{43940000H} 对应的十进制数。

解答

  1. 43940000H 转换为 32 位二进制串: 0  10000111  0010100000000000000000020 \ | \ 10000111 \ | \ 00101000000000000000000_2
  2. 分解并解析各字段:
    • 符号位 S=0S = 0,表示正数。
    • 阶码字段 E=100001112=135E = 10000111_2 = 135。真实指数为 e=135127=8e = 135 - 127 = 8
    • 尾数字段 M=.001012M = .00101_2。加上隐含位 1,规格化尾数为 1.0010121.00101_2
  3. 还原十进制数: V=+1.001012×28=1001010002=256+32+8=296V = +1.00101_2 \times 2^8 = 100101000_2 = 256 + 32 + 8 = 296 对应的十进制数是 296

习题2.11 单精度浮点数能表示的最大数和最小数#

原题:求单精度浮点数能表示的最大数和最小数。

解答

  • 最大正数(最大规格化数): 符号位 S=0S = 0;阶码字段取最大有效值 254,对应真实阶码 e=127e = 127;尾数取最大值全 1。 计算值为:(2223)×2127=21282104(2 - 2^{-23}) \times 2^{127} = 2^{128} - 2^{104}
  • 最小负数: 符号位 S=1S = 1(代表负数,数轴上最左端);阶码和尾数均取最大值。 计算值为:(2223)×2127=(21282104)-(2 - 2^{-23}) \times 2^{127} = -(2^{128} - 2^{104})
  • 最小规格化正数: 符号位 S=0S = 0;阶码字段取规格化最小值 1,指数 e=126e = -126;尾数字段为全 0。 计算值为:1.0×21261.0 \times 2^{-126}
  • 最小非规格化正数: 符号位 S=0S = 0;阶码字段为全 0,尾数字段的最低位为 1。 计算值为:223×2126=21492^{-23} \times 2^{-126} = 2^{-149}

习题2.12 正浮点数的比对分析#

原题:设有两个正浮点数:N1=2m×M1N_1 = 2^m \times M_1N2=2n×M2N_2 = 2^n \times M_2。 ( 1 ) 若 m<nm < n,是否有 N1>N2N_1 > N_2? ( 2 ) 若 M1M_1M2M_2 是规格化的数,上述结论是否正确?

解答

  • ( 1 ) 若 m<nm < n,不一定有 N1>N2N_1 > N_2反例证明:设 m=0,n=1m = 0, n = 1。如果尾数 M1=8M_1 = 8(未规格化), M2=1M_2 = 1,则 N1=20×8=8N_1 = 2^0 \times 8 = 8N2=21×1=2N_2 = 2^1 \times 1 = 2,此时 N1>N2N_1 > N_2 成立。 反之,若 M1=1M_1 = 1M2=8M_2 = 8,则 N1=20×1=1N_1 = 2^0 \times 1 = 1N2=21×8=16N_2 = 2^1 \times 8 = 16,此时 N1<N2N_1 < N_2。因此无法直接判断。
  • ( 2 ) 若 M1M_1M2M_2 是规格化的二进制小数,则结论依然不正确。且实际大小关系相反,一定有 N1<N2N_1 < N_2原理分析:对于二进制规格化小数尾数,其大小范围被严格限制在 12M<1\frac{1}{2} \leq M < 1 之间。 若 m<nm < n,因指数为整数,至少有 nm+1n \geq m + 1
    • 对于 N1N_1,其最大上限满足:N1=2m×M1<2m×1=2mN_1 = 2^m \times M_1 < 2^m \times 1 = 2^m
    • 对于 N2N_2,其最小下限满足:N2=2n×M22m+1×12=2mN_2 = 2^n \times M_2 \geq 2^{m+1} \times \frac{1}{2} = 2^m。 由此可得:N1<2mN2N_1 < 2^m \leq N_2。即规格化下,必然有 N1<N2N_1 < N_2

习题2.13 阶码 3 位、尾数 7 位的浮点数极限表示#

原题:设二进制浮点数的阶码为 3 位,尾数为 7 位。用模 2 补码写出它们所能表示的最大正数、最小正数、最大负数和最小负数,并将它们转换成十进制数。

解答: 假定阶码和尾数均采用补码表示,且尾数为规格化定点小数(符号位 1 位,数值位 6 位)。 阶码 3 位补码表示的范围为 43-4 \sim 3。正数规格化尾数范围为 0.10000020.11111120.100000_2 \sim 0.111111_2;负数规格化尾数范围为 1.00000021.01111121.000000_2 \sim 1.011111_2

  • 最大正数: 阶码取最大值 33(补码 011);尾数取最大正规格化尾数 6364\frac{63}{64}(补码 0.111111)。 十进制值为:6364×23=638=7.875\frac{63}{64} \times 2^3 = \frac{63}{8} = 7.875
  • 最小正数: 阶码取最小值 4-4(补码 100);尾数取最小正规格化尾数 12\frac{1}{2}(补码 0.100000)。 十进制值为:12×24=25=0.03125\frac{1}{2} \times 2^{-4} = 2^{-5} = 0.03125
  • 最大负数(最接近 0 的负数): 阶码取最小值 4-4(补码 100);尾数取绝对值最小的负规格化尾数(补码 1.011111,真值为 1+3164=3364-1 + \frac{31}{64} = -\frac{33}{64},即 0.1000012-0.100001_2)。 十进制值为:3364×24=3310240.032227-\frac{33}{64} \times 2^{-4} = -\frac{33}{1024} \approx -0.032227
  • 最小负数(绝对值最大的负数): 阶码取最大值 33(补码 011);尾数取最小规格化负尾数 1-1(补码 1.000000)。 十进制值为:1×23=8-1 \times 2^3 = -8

习题2.14 十进制数转定长浮点规格化表示#

原题:将下列十进制数表示成浮点规格化数,阶码为 4 位,尾数为 10 位,各含 1 位符号,阶码和尾数均用补码表示。 ( 1 ) 57/12857/128; ( 2 ) 69/128-69/128

解答

  • ( 1 ) 表示 57/12857/128
    • 数值为正,写成二进制为 57128=0.01110012\frac{57}{128} = 0.0111001_2
    • 正数规格化(尾数绝对值应在 0.510.5 \sim 1 之间): 0.01110012=0.1110012×210.0111001_2 = 0.111001_2 \times 2^{-1}
    • 阶码为 1-1,补码表示为 1111
    • 尾数为 +0.1110012+0.111001_2,补齐 10 位有符号小数补码为 0.111001000
    • 最终编码为:1111, 0.111001000
  • ( 2 ) 表示 69/128-69/128
    • 数值为负,写成二进制为 69128=0.10001012-\frac{69}{128} = -0.1000101_2
    • 负数规格化(绝对值在 0.510.5 \sim 1 之间,补码尾数满足 1.01.0\dots 形式): 由于 0.10001012-0.1000101_2 本身已经在范围之内,所以阶码为 00,补码为 0000
    • 求尾数 0.10001012-0.1000101_2 的 10 位补码:
      • 原码为 1.100010100
      • 取反加 1 得补码为 1.011101100
    • 最终编码为:0000, 1.011101100

习题2.15 校验码设计与检错分析#

原题:设有效信息为 01011011,分别写出其奇校验码和偶校验码。如果接收方收到的校验码为 010110100,说明如何发现错误。

解答

  1. 统计有效数据:有效信息为 01011011,其中二进制“1”的个数为 5。
  2. 计算奇校验码:要求 1 的总个数为奇数。数据中已有 5 个 1(奇数),因此校验位填 0,奇校验码为 010110110
  3. 计算偶校验码:要求 1 的总个数为偶数。数据中已有 5 个 1(奇数),因此校验位填 1,偶校验码为 010110111
  4. 接收端检错分析
    • 接收方收到的数据为 010110100,统计其包含“1”的个数为 4。
    • 若系统采用的是奇校验,而 4 是偶数,不满足奇数个 1 的校验规则,因此检错电路输出异常,成功发现错误。
    • 若系统采用的是偶校验,而 4 是偶数,满足偶校验规则,此时校验电路判定无错,从而发生了漏检。

习题2.16 ASCII 交叉校验填空推理#

原题:由 6 个字符的 7 位 ASCII 字符排列,再加上水平和垂直偶校验位构成表 2.27 所示的行列结构…

解答: 偶校验原则:每行、每列(含校验位本身)中“1”的总个数必须为偶数。

  1. 第一行(字符 3)
    • ASCII 码 3=33H=011001123 = \text{33H} = 0110011_2
    • 对应数据行:0X1X200110 \quad X_1 \quad X_2 \quad 0 \quad 0 \quad 1 \quad 1,对照可得:X1=1,X2=1X_1 = 1, X_2 = 1
  2. 第二行(字符 Y1Y_1
    • 数据行:100100X31 \quad 0 \quad 0 \quad 1 \quad 0 \quad 0 \quad X_3,水平校验位 HP=1HP = 1
    • 前面有 2 个 1,加上 HPHP 一共 3 个 1。要保持整行有偶数个 1,必须使 X3=1X_3 = 1
    • 该行的 7 位二进制码为 10010012=49H1001001_2 = \text{49H},查表可知代表字符 I。即 Y1=IY_1 = I
  3. 第三行(字符 +)
    • ASCII 码 +=2BH=01010112+ = \text{2BH} = 0101011_2
    • 对应数据行:X4101011X_4 \quad 1 \quad 0 \quad 1 \quad 0 \quad 1 \quad 1,对照可得:X4=0X_4 = 0
  4. 第五行(字符 D)
    • ASCII 码 D=44H=10001002D = \text{44H} = 1000100_2
    • 对应数据行:100X710X81 \quad 0 \quad 0 \quad X_7 \quad 1 \quad 0 \quad X_8,对照可得:X7=0,X8=0X_7 = 0, X_8 = 0
  5. 第四行(字符 Y2Y_2)与第 3 列、第 4 列
    • 第 3 列数据:X2,0,0,X5,0,1,VP(1)X_2, 0, 0, X_5, 0, 1, VP(1)。已知 X2=1X_2 = 1,此列中 1 的个数为 1+X5+1+1=3+X51 + X_5 + 1 + 1 = 3 + X_5。要使列满足偶校验, X5=1X_5 = 1
    • 第 4 列数据:0,1,1,X6,X7,1,VP(1)0, 1, 1, X_6, X_7, 1, VP(1)。已知 X7=0X_7 = 0,此列中 1 的个数为 1+1+X6+1+1=4+X61 + 1 + X_6 + 1 + 1 = 4 + X_6。要使列满足偶校验, X6=0X_6 = 0
    • 得到第四行数据为 01101112=37H0110111_2 = \text{37H},查表代表字符 7。即 Y2=7Y_2 = 7
  6. 第六行(字符 =)与第 1 列、第 6 列
    • ASCII 码 ==3DH=01111012= = \text{3DH} = 0111101_2
    • 对应数据行:0X9111X1010 \quad X_9 \quad 1 \quad 1 \quad 1 \quad X_{10} \quad 1,对照可得:X9=1,X10=0X_9 = 1, X_{10} = 0
    • 第 6 列数据:1,0,1,1,0,X10,X111, 0, 1, 1, 0, X_{10}, X_{11}(即 1,0,1,1,0,0,X111, 0, 1, 1, 0, 0, X_{11})。列中 1 的个数为 3+X113 + X_{11},为偶数则 X11=1X_{11} = 1
  7. 最后一行(VP)与水平偶校验列(HP)
    • HPHP 列数据:0,1,0,1,0,1,X120, 1, 0, 1, 0, 1, X_{12}。前 6 位包含 3 个 1,为满足偶校验, X12=1X_{12} = 1

填空最终结果

  • X1,X2,X3,X4X_1, X_2, X_3, X_4 处的比特分别为 1, 1, 1, 0
  • X5,X6,X7,X8X_5, X_6, X_7, X_8 处的比特分别为 1, 0, 0, 0
  • X9,X10,X11,X12X_9, X_{10}, X_{11}, X_{12} 处的比特分别为 1, 0, 1, 1
  • Y1Y_1Y2Y_2 处的字符分别为 I7

习题2.17 海明校验码完整计算与纠错#

原题:设 8 位有效信息为 0110111001101110,试写出它的海明校验码。给出过程,说明分组检测方式,并给出指错字及其逻辑表达式。如果接收方收到的 8 位有效信息变成 0110111101101111,试说明如何定位错误并纠正错误。

解答

  1. 确定校验位个数: 有效信息长度 m=8m = 8。由 2r8+r+12^r \geq 8 + r + 1 可知最小校验位个数 r=4r = 4。总码长为 12 位。
  2. 位置分配布局: 校验位 P1,P2,P4,P8P_1, P_2, P_4, P_8 依次放置在位号 1, 2, 4, 8 处,数据位 D1D8D_1 \sim D_8 填充在其余位置:
    • H1=P1, H2=P2, H3=D1(0), H4=P4, H5=D2(1), H6=D3(1), H7=D4(0)H_1 = P_1, \ H_2 = P_2, \ H_3 = D_1(0), \ H_4 = P_4, \ H_5 = D_2(1), \ H_6 = D_3(1), \ H_7 = D_4(0)
    • H8=P8, H9=D5(1), H10=D6(1), H11=D7(1), H12=D8(0)H_8 = P_8, \ H_9 = D_5(1), \ H_{10} = D_6(1), \ H_{11} = D_7(1), \ H_{12} = D_8(0)
  3. 计算校验位的值(偶校验): 每个校验位负责检验其二进制展开中包含自身位号的位。
  • P1P_1 负责:H1,H3,H5,H7,H9,H11    P101011=0    P11=0    P1=1H_1, H_3, H_5, H_7, H_9, H_{11} \implies P_1 \oplus 0 \oplus 1 \oplus 0 \oplus 1 \oplus 1 = 0 \implies P_1 \oplus 1 = 0 \implies P_1 = 1
  • P2P_2 负责:H2,H3,H6,H7,H10,H11    P201011=0    P21=0    P2=1H_2, H_3, H_6, H_7, H_{10}, H_{11} \implies P_2 \oplus 0 \oplus 1 \oplus 0 \oplus 1 \oplus 1 = 0 \implies P_2 \oplus 1 = 0 \implies P_2 = 1
  • P4P_4 负责:H4,H5,H6,H7,H12    P41100=0    P40=0    P4=0H_4, H_5, H_6, H_7, H_{12} \implies P_4 \oplus 1 \oplus 1 \oplus 0 \oplus 0 = 0 \implies P_4 \oplus 0 = 0 \implies P_4 = 0
  • P8P_8 负责:H8,H9,H10,H11,H12    P81110=0    P81=0    P8=1H_8, H_9, H_{10}, H_{11}, H_{12} \implies P_8 \oplus 1 \oplus 1 \oplus 1 \oplus 0 = 0 \implies P_8 \oplus 1 = 0 \implies P_8 = 1
    • 海明校验码最终为110011011110
  1. 指错字逻辑表达式: 接收端定义 4 位指错字 S8S4S2S1S_8S_4S_2S_1
    • S1=H1H3H5H7H9H11S_1 = H_1 \oplus H_3 \oplus H_5 \oplus H_7 \oplus H_9 \oplus H_{11}
    • S2=H2H3H6H7H10H11S_2 = H_2 \oplus H_3 \oplus H_6 \oplus H_7 \oplus H_{10} \oplus H_{11}
    • S4=H4H5H6H7H12S_4 = H_4 \oplus H_5 \oplus H_6 \oplus H_7 \oplus H_{12}
    • S8=H8H9H10H11H12S_8 = H_8 \oplus H_9 \oplus H_{10} \oplus H_{11} \oplus H_{12}
  2. 纠错定位分析: 若有效数据变成 01101111,说明第 8 个数据位 D8D_8(对应海明码第 12 位)由 0 变为了 1。 此时接收到的海明码为 110011011111。带入计算指错字:
    • S1=101011=0S_1 = 1 \oplus 0 \oplus 1 \oplus 0 \oplus 1 \oplus 1 = 0
    • S2=101011=0S_2 = 1 \oplus 0 \oplus 1 \oplus 0 \oplus 1 \oplus 1 = 0
    • S4=01101=1S_4 = 0 \oplus 1 \oplus 1 \oplus 0 \oplus 1 = 1
    • S8=11111=1S_8 = 1 \oplus 1 \oplus 1 \oplus 1 \oplus 1 = 1
    • 得到指错字为 S8S4S2S1=11002=12S_8S_4S_2S_1 = 1100_2 = 12
    • 指错字的值为 12,表明第 12 位发生错误。将第 12 位取反(由 1 变回 0),即可完成自动纠错,恢复出正确的有效信息 01101110

习题2.18 循环冗余校验码计算与检错纠错#

原题:设要采用 CRC 码传送数据信息 x=1001x=1001,当生成多项式为 G(x)=1101G(x)=1101 时,请写出它的循环冗余校验码。若接收方收到的数据信息为 x=1101x'=1101,说明如何定位错误并纠正错误。

解答

  1. 生成 CRC 校验码
    • 生成多项式 G(x)=1101G(x) = 1101(阶数 r=3r = 3)。
    • 在数据 10011001 后追加 3 个 0,得 10010001001000
    • 1001000100100011011101 做模 2 除法(即异或运算代替减法): 1001000÷1101    余数为 0111001000 \div 1101 \implies 余数为 \ 011
    • 故 CRC 校验位为 011
    • 最终循环冗余校验码为 1001011
  2. 接收端出错定位与纠正
    • 若接收到的数据信息为 x=1101x' = 1101,拼上原校验位 011,得到接收码字为 1101011
    • 用生成多项式 110111011101011 做模 2 除法: 1101011÷1101    余数为 0111101011 \div 1101 \implies 余数为 \ 011
    • 因为余数为 011 不为 0,说明传输中发生了错误。
    • 假设仅发生单比特错误,建立该多项式下的综合余数表:
      • 若第 1 位错,余数为 110
      • 若第 2 位错,余数为 011
      • 若第 3 位错,余数为 111
      • 若第 4 位错,余数为 101
      • 若第 5 位错,余数为 100
      • 若第 6 位错,余数为 010
      • 若第 7 位错,余数为 001
    • 对照所得的余数 011,在表中对应第 2 位出错。
    • 纠错:将接收码字 1101011 的第 2 位取反,得到正确码字 1001011,恢复出正确的数据信息为 1001

2.8 本章总结#

本章核心公式及知识体系整理如下:

核心计算公式一览#

性能评价指标公式 / 关系式适用场景
无符号数范围02n10 \sim 2^n - 1纯数值计算
定点整数补码范围2n12n11-2^{n-1} \sim 2^{n-1} - 1有符号整数存储
定点小数补码范围112(n1)-1 \sim 1 - 2^{-(n-1)}纯小数数值表示
单精度浮点数公式V=(1)S×1.M×2E127V = (-1)^S \times 1.M \times 2^{E - 127}32 位浮点数大小确定
海明码检验不等式2rm+r+12^r \ge m + r + 1确定海明码校验位个数
最小纠检错码距de+t+1d \ge e + t + 1设计系统容错机制

数据表示在底层的处理机制直接决定了计算机的运算方式。在学习时,应当注重补码与规格化浮点数的细节特征,并通过实际计算熟练掌握海明校验的计算过程,为进一步学习运算器硬件做好铺垫。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

数据信息的表示
https://dawn114514.site/posts/计组/数据信息的表示/
作者
黎明
发布于
2026-06-28 09:40:00
许可协议
MIT

部分信息可能已经过时

目录