一. 计算机组成与体系结构
1. 数据的表示
(1)进制转换
进制 | 数码 | 基数 | 位权 |
十进制(D) | 0,1,2,3,4,5,6,7,8,9 | 10 | |
二进制(B) | 0,1 | 2 | |
十六进制(H) | 0~9,A,B,C,D,E,F | 16 |
按权展开法:
二进制 10100.01 = 1 × + 0 + 1 × + 0 + 0 + 0 + 1 ×
七进制 604.01 = 6 × + 0 + 4 × + 0 + 1 ×
其余进制类似,替换基数即可。
除基取余法:
94 转换为二进制数,
94 / 2 = 47 余 0
47 / 2 = 23 余 1
23 / 2 = 11 余 1
11 / 2 = 5 余 1
5 / 2 = 2 余 1
2 / 2 = 1 余 0
1 / 2 = 0 余 1
直到商为0,得到结果从下往上记录,即 1011110。
转换为十六进制数类似,除以16即可,
94 / 16 = 5 余 14(E)
5 / 16 = 0 余 5
得到结果 5E,通常在后面再加一个 H 表示十六进制,即5EH。
减法(快速转换):
;;;;;;;;;
;
94 转换为二进制,
64 < 94 < 128,小于且离 94 最近的乘幂为 ,94 - 64 = 30
16 < 30 < 32,小于且离 30 最近的乘幂为 ,30 - 16 = 14
8 < 14 < 16,,14 - 8 = 6
4 < 6 < 8,,6 - 4 = 2
2 - 2 = 0,
结果为 1011110,
位号 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
取值 | 1 | 0 | 1 | 1 | 1 | 1 | 0 |
二进制转八进制与十六进制:
10001110
转八进制:从最右侧开始,三位为一个整体,高位不够三位补 0。
即 010 001 110 -> 2 1 6
转十六进制:从最右侧开始,四位为一个整体,高位不够补 0。
即 1000 1110 -> 8 E
(2)原/反/补/移码
原码:最高位是符号位,其余低位表示数值的绝对值。
反码:正数的反码与原码相同,负数的反码使其绝对值按位取反,符号位不变。
补码:正数的补码与原码相同,负数的补码使其反码末位加 1 ,符号位不变。
移码:补码的符号位按位取反。
数值 1 | 数值 -1 | 1+(-1) | |
原码 | 0 000 0001 | 1 000 0001 | 1 000 0010 |
反码 | 0 000 0001 | 1 111 1110 | 1 111 1111 |
补码 | 0 000 0001 | 1 111 1111 | 0 000 0000 |
移码 | 1 000 0001 | 0 111 1111 | 1 000 0000 |
通常只有补码参与计算,因为其计算结果最为准确:1-1=0,对应 0 000 0000。
码制 | 定点整数 | 定点小数 | 码数个数 |
原码 | |||
反码 | |||
补码 | |||
移码 |
可以采用 n = 3 验证,即计算机采用三位的数字表示形式。
整数有:000,001,010,011,100,101,110,111。共 8 种数字。
但 000 和 100 分别表示 +0 和 -0,因此排除 -0,即码数为 7个(原、反)。
在补码和移码中,多了人为规定,没有排除 -0,而是重新利用 -0 ,即 100,将其当作 ,所以码数仍然为 8 个(补、移)。
小数有:0.00,0.01,0.10,0.11,1.00,1.01,1.10,1.11。共 8 种数字。
原码和反码种同样存在 +0 与 -0,排除 -0,码数为 7 。
补码和移码也同样利用 -0,即 1.00,将其当作完整的数字 -1。所以补码和移码的范围从 -1 开始,并且码数个数为 8 个。
例题1:
采用 n 位补码(包含一个符号位)表示数据,可以直接表示数值()。
A. B. C. D.
解析1:
假设 n = 3,分别对应四个选项为 8,-8,4,-4。应当想到补码中有一个人为规定,100 为 -0,重新利用,被当作 。即 -4,所以选D。或者直接想到其取值范围,n = 3 时补码的取值范围是 -4 ~ +3。
例题2:
如果 "2X" 的补码时 "90H",那么 X 的真值为()。
A.72 B.-56 C.56 D.111
解析2:
90H 是十六进制数,先转换成二进制数为 1001 0000,并且是补码。需要求真值,即原码,那么需要先将补码转换成反码,再转换成原码。
负数的原码到反码是符号位不变,按位取反,再到补码是反码末位加 1,符号位不变。
那么反过来就是,补码到反码,末位减 1,即 1001 0000 减 1,得到 1000 1111(减一不够就借位,借到第 4 位的 1。),然后再按位取反,得到 1111 0000。但此时仍是 2X 的原码,需要再除以 2,可以先得到原数值为 - 0111 0000,即 = -56。其实在看到 1111 0000时已经能得到答案是负数,选B即可。
后续会慢慢更新。