第二章 数据的表示与运算

2.1 数制与编码 ⭐

2.1.1 进位计数制

进位制 基数 数码
二进制 2 0, 1 2^i
八进制 8 0~7 8^i
十进制 10 0~9 10^i
十六进制 16 0~9, A~F 16^i

2.1.2 进制转换 ⭐

十进制 → 其他进制:除基取余法

125 ÷ 2 = 62 ... 1  (余数)
 62 ÷ 2 = 31 ... 0
 31 ÷ 2 = 15 ... 1
 15 ÷ 2 =  7 ... 1
  7 ÷ 2 =  3 ... 1
  3 ÷ 2 =  1 ... 1
  1 ÷ 2 =  0 ... 1

从下往上读取:125(D) = 1111101(B)

其他进制 → 十进制:按权展开求和

10110110(B) = 1×2^7 + 0×2^6 + 1×2^5 + 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^0
            = 128 + 0 + 32 + 16 + 0 + 4 + 2 + 0
            = 182(D)

二进制 ↔ 八进制:三位一组

二进制 → 八进制:从小数点开始向左/右每3位一分
101 101 110 (B) = 5 5 6 (O)

八进制 → 二进制:每位用3位二进制表示
726(O) = 111 010 110 (B)

二进制 ↔ 十六进制:四位一组

二进制 → 十六进制:从小数点开始向左/右每4位一分
1010 1101 0110 (B) = A D 6 (H)

十六进制 → 二进制:每位用4位二进制表示
3F9(H) = 0011 1111 1001 (B)

2.1.3 BCD码

BCD(Binary-Coded Decimal):用二进制表示的十进制数

十进制数 8421BCD
0 0000
1 0001
9 1001
59 0101 1001
255 0010 0101 0101

2.1.4 ASCII码

字符 ASCII码(十进制) ASCII码(十六进制)
'0' 48 30H
'A' 65 41H
'a' 97 61H
空格 32 20H
回车 13 0DH

2.1.5 汉字编码

编码类型 说明 位数
区位码 区码+位码 14位
GB2312 6763个汉字 16位
GBK 21003个汉字 16位
Unicode 统一码 16/32位
UTF-8 Unicode转换格式 变长1-4字节

2.2 定点数的表示 ⭐⭐

2.2.1 定点与浮点

2.2.2 原码

定义:最高位为符号位,0表示正,1表示负;数值部分用真值的绝对值表示。

例:+45 → 原码 = 00101101
    -45 → 原码 = 10101101

特点: - 0有两种表示:+0 = 00000000,-0 = 10000000 - 运算复杂(需判断符号位) - 8位表示范围:-(2^7-1) ~ +(2^7-1) = -127 ~ +127

2.2.3 反码

定义: - 正数:反码 = 原码 - 负数:符号位不变,数值位按位取反

例:+45 → 原码 = 00101101 → 反码 = 00101101
    -45 → 原码 = 10101101 → 反码 = 11010010

特点: - 0有两种表示:+0 = 00000000,-0 = 11111111 - 8位表示范围:-127 ~ +127

2.2.4 补码 ⭐⭐

定义: - 正数:补码 = 原码 - 负数:补码 = 反码 + 1

例:+45 → 原码 = 00101101 → 反码 = 00101101 → 补码 = 00101101
    -45 → 原码 = 10101101 → 反码 = 11010010 → 补码 = 11010011

特点: - 0只有唯一表示:00000000 - 符号位可以参与运算 - 减法可以变为加法(模运算) - 8位表示范围:-128 ~ +127(多表示一个数:-128 = 10000000)

2.2.5 三种码制对比

码制 +0 -0 8位范围
原码 00000000 10000000 -127 ~ +127
反码 00000000 11111111 -127 ~ +127
补码 00000000 -128 ~ +127

2.2.6 补码的技巧

负数补码快速转换

补码 → 原码:再取一次补码

8位补码范围记忆: - 最大正数:01111111 = +127 - 最小负数:10000000 = -128 - 全部范围:-2^7 ~ +2^7-1


2.3 定点运算 ⭐

2.3.1 补码加减运算 ⭐⭐

公式

[A + B]补 = [A]补 + [B]补
[A - B]补 = [A]补 + [-B]补

注意:运算结果如果产生溢出(超出表示范围),结果错误!

2.3.2 溢出判断 ⭐

条件:两个同号数相加,结果异号

操作 溢出条件
正+正→负 上溢(结果为负)
负+负→正 下溢(结果为正)

判断方法

溢出 = Cn ⊕ Cn-1
其中Cn为最高位进位,Cn-1为次高位进位

2.3.3 补码运算例题 ⭐⭐

例题1:用8位补码计算 52 - 37

52 = 00110100
-37 = 11011011 (补码)

  00110100
+ 11011011
----------
 100001111

溢出位丢弃,结果 = 00001111 = 15 ✓

例题2:用8位补码计算 89 + 45

89 = 01011001
45 = 00101101

  01011001
+ 00101101
----------
  10000110

结果 = 10000110 = -122 (错误!应为134,已溢出)

例题3:判断是否溢出:67 + 78

67 = 01000011
78 = 01001110

  01000011
+ 01001110
----------
  10010001

结果为10010001 = -111

两个正数相加得到负数,**溢出**!

2.3.4 算术移位

类型 正数移位 负数移位(补码)
左移 整体左移,低位补0 整体左移,低位补0
右移 整体右移,高位补0 整体右移,高位补1

算术左移:若不溢出,等价于乘2 算术右移:等价于除2(取整)


2.4 浮点数的表示 ⭐⭐

2.4.1 浮点数格式

N = M × R^E

N:数值
M:尾数(可正可负)
R:基数(通常为2)
E:阶码(指数)

2.4.2 IEEE 754标准(重点!)

32位单精度格式

字段 位数 说明
符号位S 1位 0正1负
阶码E 8位 移码表示,偏置量127
尾数M 23位 隐藏最高位1

公式

真值 = (-1)^S × 1.M × 2^(E-127)

特殊情况

E M 表示
0 0 0
0 ≠0 非规格化数
1~254 任意 规格化浮点数
255 0 无穷大
255 ≠0 NaN

规格化浮点数特点

2.4.3 IEEE 754例题 ⭐⭐

例题1:将 -8.25 表示为IEEE 754单精度

1. 转二进制:-8.25 = -1000.01
2. 规格化:-1.00001 × 2^3
3. 确定各字段:
   S = 1
   E = 3 + 127 = 130 = 10000010
   M = 00001(只取小数部分,前面的1隐藏)
4. 结果:1 10000010 00001000000000000000000

例题2:求 1 10000010 00001000000000000000000 的真值

1. S = 1(负数)
2. E = 10000010 = 130
3. M = 00001000000000000000000
4. 真值 = (-1)^1 × 1.00001 × 2^(130-127)
        = -1.00001 × 2^3
        = -1000.01
        = -8.25

例题3:求 0 01111111 00000000000000000000000 的真值

1. S = 0(正数)
2. E = 01111111 = 127
3. 真值 = (-1)^0 × 1.0 × 2^(127-127)
        = 1.0 × 2^0
        = 1.0

2.4.4 64位双精度格式

字段 位数 偏置量
符号位S 1位 -
阶码E 11位 1023
尾数M 52位 隐藏1位

2.5 算术逻辑运算

2.5.1 算术运算

运算 说明 溢出条件
加法 A + B 同号相加结果异号
减法 A - B = A + (-B) 同上
乘法 多次加法移位 结果超范围
除法 多次减法移位 除零、结果超范围

2.5.2 逻辑运算

运算 符号 说明
AND, & 全1出1
OR, | 有1出1
异或 XOR, ^ 不同出1
NOT, ~ 取反

运算规则

与(AND):  0∧0=0, 0∧1=0, 1∧0=0, 1∧1=1
或(OR):   0∨0=0, 0∨1=1, 1∨0=1, 1∨1=1
异或(XOR):0⊕0=0, 0⊕1=1, 1⊕0=1, 1⊕1=0
非(NOT):  ~0=1, ~1=0

2.5.3 移位运算

类型 操作 用途
逻辑左移 整体左移,低位补0 无符号数乘2
逻辑右移 整体右移,高位补0 无符号数除2
算术左移 同逻辑左移 有符号数乘2
算术右移 整体右移,高位补符号位 有符号数除2

2.6 ALU的实现

2.6.1 ALU功能

ALU(Arithmetic Logic Unit):算术逻辑单元

2.6.2 ALU结构

         ┌─────────────────────┐
         │        ALU         │
         │                     │
输入A ──►│                 ┌──► F (结果)
         │              ┌──┐│
输入B ──►│              │  ▼│
         │           ┌──┴─┴──┐│
         │           │ 运算逻辑 ││
ALUop ──►│           └───────┘│
         │                 ▲  │
         │                 └──┘│
         │              标志位  │
         └─────────────────────┘

A, B:操作数输入
ALUop:操作控制信号(决定做什么运算)
F:运算结果

章节练习题

一、选择题

  1. 下列进制转换中,正确的是( ) A. 125(D) = 1111101(B) B. 125(D) = 1111100(B) C. 125(D) = 1111111(B) D. 125(D) = 11111011(B)

  2. 8位补码表示的范围是( ) A. -127 ~ +127 B. -128 ~ +127 C. -128 ~ +128 D. -127 ~ +128

  3. 下列关于补码的说法,正确的是( ) A. 0有两种表示 B. 符号位不能参与运算 C. 减法不能变为加法 D. 正数补码不等于原码

  4. IEEE 754单精度格式中,阶码的偏置量为( ) A. 127 B. 128 C. 1023 D. 2047

  5. 两个正数相加发生溢出,则( ) A. 结果为正 B. 结果为负 C. 结果为0 D. 结果可能正可能负

二、填空题

  1. 二进制数10110110转换为十进制为______。

  2. 8位原码表示中,-0的表示为______。

  3. 补码的优点之一是0的表示______。

  4. IEEE 754中,规格化浮点数的尾数最高位隐含为______。

  5. 定点数表示中,小数点固定在______位之后的是定点小数。

三、计算题

  1. 将十进制数 169 转换为二进制、八进制、十六进制。

  2. 用8位补码计算:-67 - 45

  3. 判断下列补码运算是否溢出: (a) 67 + 45 (b) -89 + (-67)

  4. 将 -0.625 表示为IEEE 754单精度格式。

  5. 求 IEEE 754 表示 1 10000001 10100000000000000000000 的真值。

四、简答题

  1. 简述原码、反码、补码的区别。

  2. 为什么计算机中采用补码来表示有符号数?

  3. 简述IEEE 754单精度浮点数的格式。


参考答案

选择题

  1. A 2. B 3. A(错!C正确:0表示唯一)→ 答案应为A
  2. A 5. B

填空题

  1. 182
  2. 10000000
  3. 唯一
  4. 1
  5. 符号位

计算题

第1题

169 ÷ 2 = 84 ... 1
 84 ÷ 2 = 42 ... 0
 42 ÷ 2 = 21 ... 0
 21 ÷ 2 = 10 ... 1
 10 ÷ 2 =  5 ... 0
  5 ÷ 2 =  2 ... 1
  2 ÷ 2 =  1 ... 0
  1 ÷ 2 =  0 ... 1

169(D) = 10101001(B) = 251(O) = A9(H)

第2题

-67 补码 = 10111101
-45 补码 = 11010011

  10111101
+ 11010011
----------
 110001000

结果 = 01001000 = +72

无溢出(两个负数相加结果为负)
正确结果应该是 -112,已溢出!

第3题

(a) 67 + 45:
    01000011 + 00101101 = 01110000 = +112
    两正数相加结果为正,无溢出

(b) -89 + (-67):
    -89 补码 = 10100111
    -67 补码 = 10111101
    相加结果 = 01100100 = +100
    两负数相加结果为正,溢出!

第4题

-0.625 = -0.101(B)
规格化:-1.01 × 2^(-1)

S = 1
E = -1 + 127 = 126 = 01111110
M = 01000000000000000000000

结果:1 01111110 01000000000000000000000

第5题

S = 1(负数)
E = 10000001 = 129
M = 10100000000000000000000

真值 = (-1)^1 × 1.101 × 2^(129-127)
     = -1.101 × 2^2
     = -1.101 × 4
     = -110.1
     = -6.5