第二部分:数据的表示与运算

2.1 数制与编码

计算机内部所有信息(指令、数字、文字、图像)都用二进制表示。你需要熟练掌握二进制、八进制、十进制、十六进制之间的转换。

基本概念

  • 二进制:基数为2,数字为0和1。计算机内部存储和处理的最小单位是位(bit)。
  • 八进制:基数为8,数字0-7。每3位二进制对应1位八进制。
  • 十六进制:基数为16,数字0-9和A-F(A=10, B=11, C=12, D=13, E=14, F=15)。每4位二进制对应1位十六进制。
  • 十进制:基数为10,数字0-9,人类最常用。

转换方法

  1. 二进制 -> 十进制:按权展开相加。 例:1011.01(B) = 1x2^3 + 0x2^2 + 1x2^1 + 1x2^0 + 0x2^{-1} + 1x2^{-2} = 8+0+2+1+0+0.25 = 11.25(D)

  2. 十进制 -> 二进制:整数部分除2取余倒序;小数部分乘2取整正序。 例:13(D) = 1101(B);0.625(D) = 0.101(B) (0.625x2=1.25取1,0.25x2=0.5取0,0.5x2=1.0取1)

  3. 二进制 <-> 八/十六进制:以小数点为界,向左向右每3位(八进制)或4位(十六进制)分组,不足补0。 例:11 0110 1110.0110 1(B) 补全为 0011 0110 1110.0110 1000(B) = 36E.68(H)

进制转换综合示例: 将十进制数 45.6875 转换为二进制、八进制和十六进制。

整数部分45:45/2=22余1, 22/2=11余0, 11/2=5余1, 5/2=2余1, 2/2=1余0, 1/2=0余1 -> 倒序得 101101(B) 小数部分0.6875:0.6875x2=1.375取1, 0.375x2=0.75取0, 0.75x2=1.5取1, 0.5x2=1.0取1 -> 正序得 1011(B) 所以 45.6875(D) = 101101.1011(B)

转八进制:从小数点起,每3位一组,不足补0 101101.1011 -> 101 101 . 101 100 -> 55.54(O)

转十六进制:从小数点起,每4位一组,不足补0 101101.1011 -> 0010 1101 . 1011 -> 2D.B(H)

验证:2D.B(H) = 2x16^1 + 13x16^0 + 11x16^{-1} = 32 + 13 + 0.6875 = 45.6875(D) ✓

⚠️ 易错点:

  • 小数部分转换时,注意"乘2取整正序"(和整数部分的"除2取余倒序"方向相反)。很多同学小数部分用了倒序导致结果错误。
  • 二进制分组时,整数部分向左(高位)补0,小数部分向右(低位)补0,不要搞反。
  • 八进制和十六进制转换时,要注意小数点位置保持不变。

其他编码(了解即可)

  • BCD码(8421码):用4位二进制表示一位十进制数,例如 19(D) = 0001 1001(BCD)。缺点:浪费位,运算需调整。
  • 余3码:BCD码+0011,如 0->0011,1->0100。常用于简化进位处理。
  • 格雷码:相邻两个数只有一位不同,用于模数转换和抗干扰。例如 0=0000, 1=0001, 2=0011, 3=0010。

💡 记忆技巧:

  • 十六进制字母对应:A=10, B=11, C=12, D=13, E=14, F=15 —— 可以记为 A Big Cat Does Eat Fish(A大猫吃鱼)。
  • 二进制转十六进制:每4位一组,记住 1010=A, 1011=B, 1100=C, 1101=D, 1110=E, 1111=F。
  • 余3码 = BCD + 3,记忆为"余3就是加3"。

2.2 定点数的表示

定点数是指小数点的位置固定不变。计算机中主要处理整数(定点整数)和纯小数(定点小数)。

无符号整数

  • 所有位都表示数值,没有符号位。n位无符号整数的范围:0 到 2^n - 1。
  • 例如 8位无符号整数:0~255。

有符号整数 有符号数需要表示正负。常用三种编码:原码、反码、补码,以及移码(主要用于浮点数的阶码)。

原码

  • 最高位为符号位(0正1负),其余位表示数值的绝对值。
  • 例如8位原码:+5 = 0000 0101,-5 = 1000 0101。
  • 缺点:0有两种表示(+0=0000 0000,-0=1000 0000);加减法复杂(需要根据符号位单独处理)。

反码

  • 正数的反码与原码相同。负数的反码:符号位为1,其余位按位取反。
  • 例如8位反码:+5 = 0000 0101,-5 = 1111 1010。
  • 缺点:同样存在+0和-0(0000 0000 与 1111 1111);加减法仍需要循环进位(端回进位)。

补码

  • 正数的补码与原码相同。负数的补码:反码+1。
  • 例如8位补码:+5 = 0000 0101,-5 = 1111 1011。
  • 优点:0只有一种表示(0000 0000);加减法统一使用加法,溢出处理简单。现代计算机全部采用补码表示有符号整数。
  • n位补码范围:-2^(n-1) 到 2^(n-1)-1。8位补码:-128~127。
  • 转换技巧:从负数的补码求其绝对值:补码取反加1得到原码(忽略符号位)。例如 1111 1011 取反得 0000 0100,加1得 0000 0101 = 5,所以原数是-5。

补码关键性质(深入理解):

  • 补码的符号位参与运算:在补码加法中,符号位和数值位一起参与加法运算,进位自然溢出即可。
  • 补码的"模"概念:n位补码的模为2^n。负数-x的补码 = 2^n - x(不考虑符号位)。
  • 例如:-5在8位补码 = 2^8 - 5 = 256 - 5 = 251 = 1111 1011(B)

补码加减法计算示例: 例1:计算 8位补码 3 + (-5) 3的补码 = 0000 0011 -5的补码 = 1111 1011 直接相加:0000 0011 + 1111 1011 = 1111 1110 1111 1110是补码,取反加1得 0000 0010 = 2,所以结果是-2。✓

例2:计算 8位补码 (-3) + (-5) -3的补码 = 1111 1101 -5的补码 = 1111 1011 相加:1111 1101 + 1111 1011 = 1 1111 1000(进位1自然丢失) 结果为 1111 1000,取反加1得 0000 1000 = 8,所以是-8。✓

例3:溢出情况——8位补码 120 + 50 120 = 0111 1000,50 = 0011 0010 相加:0111 1000 + 0011 0010 = 1010 1010 结果符号位为1(负数),但两个正数相加应为正数,所以溢出。 验证:120+50=170,而8位补码最大正数为127,确实超出范围。

移码

  • 在补码的基础上,将符号位取反(或者说加上一个偏置常数2^(n-1))。
  • 例如8位移码:+5 = 1000 0101(原补码0000 0101符号位取反),-5 = 0111 1011。
  • 移码主要用于浮点数的阶码,便于比较大小(移码大的真值大)。

定点小数

  • 小数点在最高位之后,即符号位之后。n位定点小数表示范围:-1 ~ 1-2^(-(n-1))。
  • 原码、补码等规则与整数类似,只是权重为2的负幂次。例如补码定点小数:1.0000 表示 -1,0.1111 表示 0.9375。

各编码范围对比表(n位二进制,含符号位):

编码方式 最小值 最大值 0的表示种数
无符号整数 0 2^n-1 1
原码 -(2^(n-1)-1) 2^(n-1)-1 2(+0和-0)
反码 -(2^(n-1)-1) 2^(n-1)-1 2(+0和-0)
补码 -2^(n-1) 2^(n-1)-1 1
移码 -2^(n-1) 2^(n-1)-1 1

⚠️ 易错点:

  • 补码范围不对称:8位补码最小是-128,最大是127,因为0只占一个编码,多出来的编码给了-128。注意-128的补码是1000 0000。
  • 从补码求真值:负数的补码看起来是一个很大的正数(如1111 1011=251),不要直接当成无符号数,要取反加1再取负。
  • 原码和反码的"0"有两种表示,补码只有一种,这是补码最大的优势之一。

💡 记忆技巧:

  • 补码转换口诀:"正补不变,负补取反加一"
  • 从补码求真值:"补码变原码,同样取反加一"
  • 8位补码范围:-128 ~ +127 可以记为 "-128到127,负多一个"
  • 原码、反码、补码关系:
    • 原码 -> 反码:符号位不变,数值位取反
    • 反码 -> 补码:加1
    • 原码 -> 补码:取反加一(符号位不变)

2.3 浮点数的表示

定点数范围有限,无法表示很大或很小的数,所以计算机使用浮点数(类似科学计数法)。考研主要考IEEE 754标准。

类比理解:浮点数就是计算机中的"科学计数法"。就像科学计数法把 1,230,000,000 写成 1.23x10^9,浮点数把二进制数写成 (-1)^S x 1.M x 2^(E-127)。指数让小数点可以"浮动",从而表示极大的数和极小的数。

IEEE 754 单精度(32位) 格式:1位符号S + 8位阶码E + 23位尾数M(隐含1位整数部分1)

  • 真值 = (-1)^S x (1.M) x 2^(E-127)
  • 阶码E用移码表示,偏置常数127(双精度为1023)。
  • 尾数M是小数部分,实际有效数字为1.M(规格化数时)。

规格化数:当E不全为0且不全为1时,表示规格化浮点数。此时隐含的整数部分为1。 例如:十进制 -0.75 = -1.5 x 2^(-1)

  • 符号S=1
  • 1.5的二进制为1.1,所以M = 0.1(即23位中存储100...0)
  • 阶码实际值为-1,加上偏置127得126,二进制 0111 1110
  • 最终32位:1 01111110 10000000000000000000000

IEEE 754完整示例: 将十进制数 5.75 转换为IEEE 754单精度浮点数。

步骤1:确定符号。5.75为正,S=0。 步骤2:转换为二进制。5.75 = 101.11(B)(5=101, 0.75=0.11)。 步骤3:规格化。101.11 = 1.0111 x 2^2。所以E_actual = 2,M = 0111。 步骤4:计算阶码E。E = E_actual + 127 = 2 + 127 = 129 = 1000 0001(B)。 步骤5:组合。S=0, E=10000001, M=01110000000000000000000。 结果:0 10000001 01110000000000000000000 = 40E80000(H)

IEEE 754逆转换示例: 给定32位十六进制 C0A00000,求对应的十进制数。

步骤1:C0A00000(H) = 1100 0000 1010 0000 ... 0000(B) 步骤2:分解:S=1, E=10000001, M=0100000...0 步骤3:E=129, E_actual = 129-127 = 2 步骤4:M=0.01,所以1.M = 1.01(B) = 1.25(D) 步骤5:真值 = (-1)^1 x 1.25 x 2^2 = -1.25 x 4 = -5.0 ✓

非规格化数:当E=0,M!=0时,表示非常接近0的数。此时隐含整数部分为0,真值 = (-1)^S x (0.M) x 2^(-126)。 特殊值:

  • E=0, M=0 -> 0(正0和负0)
  • E=255, M=0 -> 无穷大(正无穷或负无穷)
  • E=255, M!=0 -> NaN(Not a Number,如0/0的结果)

非规格化数示例: 最小的正非规格化数:S=0, E=0, M=00...01(最低位为1) 真值 = 0.00...01 x 2^(-126) = 2^(-23) x 2^(-126) = 2^(-149) = 1.4x10^(-45)

双精度(64位):1位S + 11位E + 52位M,偏置1023。

浮点数的舍入规则(了解即可)

  • 就近舍入(默认):向最近的可表示值舍入,中间情况向偶数舍入。
  • 向上舍入、向下舍入、向零舍入。

浮点数的表示范围(单精度)

  • 最小正规格化数:2^(-126) = 1.18x10^(-38)
  • 最大正规格化数:约 3.4x10^(38)
  • 非规格化数可表示更接近0的数(最小正非规格化数:2^(-149) = 1.4x10^(-45))

⚠️ 易错点:

  • IEEE 754中隐含的整数部分是"1"(规格化时),不是"0"。只有在非规格化数时才为"0"。
  • 阶码是用移码(偏置127)表示,不是补码。计算真值时一定要减去127。
  • 浮点数的精度由尾数位数决定,范围由阶码位数决定。
  • 不要把单精度的偏置127和双精度的偏置1023弄混。

💡 记忆技巧:

  • IE 754三段结构:S(1位) + E(8位) + M(23位),口诀**"一符八阶廿三位"**
  • 阶码偏移量:单精度127,双精度1023。记忆为**"单127,双1023"**(1+2+7=10,但双精度是1023≈2^10)。
  • 规格化数特点:E既不全0也不全1,隐含整数为1。
  • NaN判定:E全1且M不全0,"全一阶码非零尾"。

2.4 算术逻辑单元(ALU)

ALU是运算器的核心,用于执行算术和逻辑运算。你需要理解基本加法器的原理,以及乘除法的基本实现思路(重点在算法思想,不需要背电路细节)。

加法器

  • 半加器:输入A、B,输出和S、进位C。真值表:0+0=0(C=0,S=0);0+1=1(C=0,S=1);1+0=1(C=0,S=1);1+1=0(C=1,S=0)。 逻辑表达式:S = A XOR B,C = A AND B。

  • 全加器:输入A、B、进位Cin,输出和S、进位Cout。 逻辑表达式:S = A XOR B XOR Cin,Cout = A AND B OR (A XOR B) AND Cin。

  • 串行进位加法器:将n个全加器串联,低位进位连到高位进位输入。电路简单,但速度慢(进位逐级传递,延迟与位数成正比)。

  • 超前进位加法器:预先计算出每一位的进位,不等待低位结果,速度快但电路复杂。现代CPU采用超前进位或混合进位。

串行进位延迟计算示例: 一个16位串行进位加法器,每个全加器产生进位需要2个门延迟(设1个门延迟为T),求最坏情况下的加法延迟。 最坏情况:进位从最低位逐级传到最高位,需要经过16个全加器。 延迟 = 16 x 2T = 32T 而超前进位加法器的延迟约为 4T(不论位数),远快于串行进位。

减法 计算机用加法器实现减法:A - B = A + (-B)。-B用补码表示(取反加1)。所以减法器可以复用加法器,只需控制B的输入取反,并将Cin设为1。

减法示例:计算 5 - 3(8位) 5的补码 = 0000 0101 -3的补码 = 1111 1101 0000 0101 + 1111 1101 = 1 0000 0010(进位1自然丢失,低位为0000 0010 = 2)✓

定点数的乘法

考研中主要考察原码乘法(一位乘)和补码乘法(Booth算法)。你不需要掌握高速乘法器细节,但要理解步骤和溢出判断。

  • 原码一位乘:符号位单独处理(正正得正,正负得负),数值部分用绝对值相乘。 步骤:初始化部分积为0,从乘数最低位开始,若该位=1,则部分积加被乘数,然后右移一位;若该位=0,则部分积加0,右移一位。重复n次。

原码一位乘完整示例:计算 3 x 2(3位二进制,使用4位寄存器防止溢出) 被乘数X=011(3),乘数Y=010(2),均为正数,符号位为0。 部分积初始为0000,乘数放在低3位(010),用1位辅助位。

循环 乘数最低位 操作 部分积 乘数(含辅助位)
初始 - - 0000 010 0
第1步 0 加0,右移 0000 001 0
第2步 1 加011得0011,右移 0001 100 1
第3步 0 加0,右移 0000 110 0

结果为 0000 0110(高4位部分积+低3位移出+最后一步右移)= 6 ✓

  • 补码一位乘(Booth算法):直接对补码进行乘法,可处理负数。核心规则:检查乘数相邻两位(y_i和y_{i-1}),初始y_{-1}=0。
    • 00或11:部分积右移一位
    • 01:部分积加被乘数,右移一位
    • 10:部分积减被乘数,右移一位 重复n次。最后不需要额外处理符号。

Booth算法示例:用Booth算法计算 (-3) x 2,4位补码。 -3的补码 = 1101(被乘数),2的补码 = 0010(乘数) 部分积初始为0000,乘数0010,y_{-1}=0。

步骤 y_i y_{i-1} 操作 部分积 乘数 y_{i-1}
初始 - - 0000 0010 0
1 00 右移 0000 0001 0
2 10 减被乘数(-3)=+3 0011 - -
右移 0001 1000 1
3 01 加被乘数(-3) 0001+1101=1110 - -
右移 1111 0100 0
4 00 右移 1111 1010 0

结果是 1111 1010(高4位部分积+低4位移出) 1111 1010是补码,取反加一得 0000 0110 = 6,所以结果是 -6 ✓

定点数的除法

  • 恢复余数法:类似笔算除法。每次试商(够减商1,不够减商0),若不够减则恢复余数(加回除数)。
  • 不恢复余数法(加减交替法):优化恢复余数法,当余数为负时,下次改为加除数,减少一次加法。

溢出判断 有符号数加减法可能溢出(结果超出表示范围)。判断方法:

  • 对于补码加法,当正+正得负,或负+负得正时溢出。
  • 硬件常用判断:最高位进位与次高位进位不同则溢出。

溢出判断示例: 8位补码,计算 120 + 50: 120=0111 1000, 50=0011 0010 相加:最高位进位=0(第7位无进位),次高位进位=1(第6位向第7位进位) 最高位进位 XOR 次高位进位 = 0 XOR 1 = 1 -> 溢出 ✓

标志位的生成(CPU状态寄存器)

  • ZF(零标志):结果全0时置1。
  • OF(溢出标志):有符号数溢出时置1。
  • SF(符号标志):结果最高位(符号位)的值。
  • CF(进位/借位标志):无符号数加减法时的进位或借位。

标志位综合示例: 8位运算:计算 200 + 100 = 300(超出255时的情况) 200=1100 1000, 100=0110 0100 相加:1100 1000 + 0110 0100 = 1 0010 1100(产生进位)

  • ZF=0(结果不为0)
  • OF=1? 两个正数(最高位为0和0)?不,200的补码1100 1000最高位为1,实际上是负数(-56),100的补码为0110 0100最高位为0(正数)。正+负不会溢出,OF=0。
  • SF=0(结果最高位为0,视为正数)
  • CF=1(无符号运算产生了进位,说明结果超过255)

💡 记忆技巧:

  • 溢出判断口诀:"正正得负、负负得正,必定溢出"
  • 硬件溢出判断(8位为例):"最高进位异或次高进位,异或为1即溢出"
  • 标志位记忆:"Z是零(Zero),O是溢出(Overflow),S是符号(Sign),C是进位(Carry)"

浮点数运算步骤(了解流程,考试中可能结合IEEE754考查)

  1. 对阶:小阶向大阶对齐,尾数右移(移位量=阶差)。
  2. 尾数加减:定点小数运算。
  3. 规格化:若结果尾数不是1.x形式,则左移或右移,同时调整阶码。
  4. 舍入:按舍入规则处理多余位。
  5. 溢出判断:阶码超出范围时溢出。

浮点数加法完整示例: 计算 5.75 + (-0.75) = 5.0

5.75 = 0 10000001 01110000000000000000000(之前已求) -0.75 = 1 01111110 10000000000000000000000(之前已求)

对阶:5.75的阶码E=129,-0.75的阶码E=126,阶差=3。 -0.75的尾数右移3位:1.100 -> 0.0011(注意隐含的1也右移了,变成非规格化) 但实际更规范的做法是写成一致阶码后运算。 运算过程略(408对此要求了解流程即可,不要求完整手算)。


2.5 移位运算与位扩展

移位运算

  • 逻辑左移:低位补0,高位丢弃。无符号整数左移相当于乘以2(可能溢出)。
  • 逻辑右移:高位补0,低位丢弃。无符号整数右移相当于除以2。
  • 算术左移:与逻辑左移相同(符号位可能改变,需注意溢出)。
  • 算术右移:高位补符号位(正数补0,负数补1),保持符号不变。用于有符号整数除以2(向负无穷舍入)。
  • 循环移位:移出的位补到另一端(如循环左移:高位移出后放到低位)。

移位运算示例: 8位有符号补码数 -8(1111 1000):

  • 算术右移1位:1111 1100 = -4(除以2的整数部分)✓
  • 算术右移2位:1111 1110 = -2 ✓
  • 算术右移3位:1111 1111 = -1(注意:-1/2=-0.5,向负无穷舍入为-1)✓
  • 逻辑右移1位:0111 1100 = 124(符号位被0填充,负数变成了正数!)

⚠️ 易错点:

  • 有符号负数算术右移时,高位补的是1(保持负数),但结果向负无穷舍入,如-1右移仍然是-1。
  • 逻辑右移和算术右移的区别:逻辑右移高位补0,算术右移高位补符号位。

位扩展(将短整数转换为长整数)

  • 零扩展:高位补0,用于无符号整数。例如 8位无符号255(11111111)扩展到16位为 0000000011111111。
  • 符号扩展:高位补符号位,用于有符号整数。例如 8位补码-1(11111111)扩展到16位为 1111111111111111,仍表示-1。

位扩展示例: 8位有符号数 -> 16位有符号数:

  • +5(0000 0101)-> 0000 0000 0000 0101(正数补0,值不变)
  • -5(1111 1011)-> 1111 1111 1111 1011(负数补1,值不变) 如果对-5用了零扩展:0000 0000 1111 1011 = 251,值完全变了。

📌 408考点提示

考查形式:

  • 选择题高频:进制转换、原码/反码/补码表示、IEEE 754浮点数格式、标志位判断、溢出判断。
  • 计算题/综合题:IEEE 754与十进制互转(如2015年408真题)、补码加减法运算、原码一位乘步骤。
  • 大题可能考查:浮点数加减运算的步骤、Booth算法的步骤描述。

常见命题模式:

  1. 给定32位十六进制,判断是IEEE 754的什么数(规格化/非规格化/特殊值),并求真值。
  2. 给定x和y的补码表示,求x+y的补码并判断是否溢出。
  3. 给定各类指令CPI和占比,结合数据表示的综合计算。
  4. 原码一位乘的手算过程(选择题中考查步骤或结果)。

学生常犯错误:

  • 补码范围记错:8位补码最小值是-128(10000000),不是-127。
  • IEEE 754阶码偏置单精度127记成128。
  • 浮点数运算中对阶的方向弄反(应该是小阶向大阶对齐)。
  • 误认为MIPS可以跨架构比较性能。
  • 溢出判断中混淆OF(有符号溢出)和CF(无符号进位)。

备考建议:

  • 熟练掌握补码加减法运算(含溢出判断),这是408必考基础能力。
  • IEEE 754的单精度格式必须做到"看到十六进制就能写出十进制"的熟练度。
  • 对Booth算法和原码一位乘,理解步骤即可,不需要死记硬背电路细节。
  • 标志位OF、CF、SF、ZF的判断要结合具体例子多练习。

第二部分小结

主题 核心要点
数制转换 二、八、十、十六进制的互相转换
有符号整数 原码、反码、补码、移码;补码是标准
浮点数 IEEE 754单精度格式:S(1)+E(8)+M(23),隐含整数1
加法器 半加器、全加器、串行进位、超前进位
乘除法 原码一位乘、Booth补码乘、恢复余数法、不恢复余数法
溢出与标志 OF、CF、SF、ZF的判断
移位与扩展 逻辑/算术移位、零扩展/符号扩展