Chap 2 Bit, 数据类型与运算
约 1332 个字 预计阅读时间 4 分钟
0 从问题描述到电子运转
序号 | 描述 |
---|---|
1 | 问题 |
2 | 算法 |
3 | 语言 |
4 | 机器(ISA)结构 |
5 | 微结构 |
6 | 电路 |
7 | 器件 |
汇编语言 和 ISA 的关系
汇编语言通常与 ISA 具有 1to1 关系,但前者有时支持更加复杂的操作(如结构化编程块)
-
汇编语言是 ISA 操作码、逻辑和指令的抽象集合,是指令的文本形式(不涉及指令编码)
-
ISA 更像是指定了指令及其二进制编码的标准文档
-
步骤 3-4 理论上就是编译原理覆盖的内容(高级语言至 ISA)
-
高级语言 -> ISA 由 编译器
compiler
完成 -
汇编语言 -> 对应 ISA 由 汇编器
assembly
-
-
指令集结构
ISA (Instruction Set Architecture)
是程序和计算机硬件接口之间的一个完整定义,包括:- 计算机可以执行的指令集合
- 每个操作所需要的数据(操作数
operand
)是什么 - 可接受的操作数表达方式(数据类型
data type
) - 定位操作数的方法(寻址模式
addressing mode
)
1 Bit & 数据类型
1.1 Bit
- 电路只有两个状态,为了表达更多的数值状态,我们可以将多条线路合并使用(形成
k-bit
的二进制数,共有 2k种不同状态)
1.2 整数
本课程使用补码( 2's Complement )表示正负整数,使用 ASCII 表示字符
-
无符号整数 Unsigned Integer
用
k-bit
可以表示 0 ~ 2k-1 的 2k 个无符号整数 -
有符号整数
我们将 2k 个位置一分为二,一半表示正数,另一半表示负数。以 5-bit 字串为例:
-
符号位表示法 Signed Magnitude
-
最高位表示符号,后 k 位表示数值(绝对值二进制串)
其中
00000
与10000
分别表示+0
,-0
-
范围为
[+0, (2^k-1)] + [-0, -(2^k-1)]
+5 的二进制编码为
00101
,则 -5 的二进制编码为10101
-
-
反码 1's Complement
-
将正数的所有 bit(包括符号位) 直接取反,即可得到其相反数的二进制编码
-
范围为
[+0, (2^k-1)] + [-(2^k-1), -0]
+5 的二进制编码为
00101
,则 -5 的二进制编码为11010
-
-
补码 2's Complement
-
负整数补码 = 正整数反码 + 1
-
范围为
[+0, (2^k-1)] + [-(2^k), -1]
,负数多一个
- +5 的二进制编码为
00101
,则 -5 的二进制编码为11011
- 使用补码的好处是计算时可以直接将二进制 逐位相加(相反数相加后为
000...0
,忽略符号位产生的进位),方便 ALU 进行计算
-
-
三种编码方式对负数表示方式的对比
- 对于符号位表示法,符号位取反
- 对于反码,所有位取反
- 对于补码,数值串 =
2^k - |n|
的原码(|n|
原码取反 + 1)
编码范围 | 符号位 | 反码 | 补码 |
---|---|---|---|
00000 ~ 01111 |
[0, 15] |
[0, 15] |
[0, 15] |
10000 ~ 11111 |
[-0, -15] |
[-15, -0] |
[-16, -1] |
补码中负数会比正数多一个 -2k
1.3 位矢 Bit Vector
类似于 bitmap
使用一个 1*N
的矢量表示 N 台机器的闲忙:a[i] = 1
表示第 i 台机器繁忙,反之表示其空闲
1.4 浮点数 Float-Point
类似于科学计数法,除符号位以外的 bit 一部分表示指数,另一部分表示精度
32 bit 的 IEEE 标准浮点数组成如下:
序号 | 含义 | 说明 |
---|---|---|
0 (1 bit) | 符号 Sign | 0 正 1 负 |
1-8 (8 bit) | 指数 Exponent | 正则化( normalized )结果,实际的为尾数部分为 1(23-bit of Frac) |
9-31 (23 bit) | 尾数 Fraction | 仅使用了 00000001 ~ 11111110 共计 254 个数字 |
- Exp 全 0 表示: $$ N = (-1)^{Sign} * (0.Frac) * 2^{-126} $$
Samples
- 用 IEEE 标准表示浮点数 -6(5/8)
- 求
001111011 + 0*22
表示的浮点数
2 进制转换(补码)
2.1 BtoD
-
检查符号位
- 首位为
0
:正数,进入 Step 2 - 首位为
1
:负数,转成相反数的补码(减一取反)
- 首位为
-
计算补码的十进制
-
若 Step 1 中为负数,则为 Step 2 的结果加上负号
2.2 DtoB
-
用短除法求得
|N|
的 k-1 bit 二进制串 -
最高位补 0 的到 k bit 二进制串,负数进入下一步
-
对 Step 2 中得到的二进制串按位取反后加一
3 运算
3.1 加减法
- 加法:按位对其,自右向左计算(进位)
- 减法:将 A-B 视为 A+(-B),即先求 -B 的补码,随后相加
补码的符号扩展:正数高位补 0
,负数高位补 1
溢出
- 溢出只会发生在同符号数相加的情况下,正负数相加永远不会溢出
-
溢出检测:在忽略最高进位的条件下,比较运算结果与两个运算数的符号,不一致时便产生溢出
两正数相加得负 / 两负数相加得正
3.2 逻辑运算
类型 | 描述 |
---|---|
AND | 全 1 出 1 |
OR | 有 1 出 1 |
NOT | 取反 |
XOR | 相同出 0,相异出 1 |
上完专业课回来有一种融会贯通的错觉(并不)