进制转换与数据编码
进制转换
R进制转十进制
R进制转十进制使用按权展开法,具体操作是将R进制的每一位数值使用$R^K$的形式表示,K表示该位与小数点的距离,当该位位于小数点左边,K表示该位和小数点之间间隔数字的个数,当该位位于小数点右侧,K是负数,其绝对值是该位与小数点之间数字个数加1
例如:
二进制 转 十进制 $$ 10100.01 = 1 \cdot 2^4 + 1 \cdot 2^2 + 1 \cdot 2^{-2} $$
七进制 转 十进制 $$ 604.01 = 6\cdot7^2+4\cdot7^0+1\cdot7^{-2} $$
十进制转R进制
十进制转R进制使用短除法
例如将94转换成二进制数
1 | 94 ÷ 2 = 47 余 0 |
将余数从后往前书写就是对应的二进制 1011110
二进制转八进制
二进制的 111 表示 八进制的 7,000表示八进制的0,二进制转换成八进制时,将二进制从低到高分为3个一组,高位不足三个的补0,分别进行转换
例如10001110转换成8进制为 216
1 | 010 001 110 |
二进制转十六进制
二进制的1111表示 十六进制的 15,0000表示十六进制的0,二进制转换成十六进制时,将二进制从低到高分为4个一组,高位不足三个的补0,分别进行转换,而在十六进制中10-15分别使用A-F进行表示
例如 1000 1110 转换成16进制为 8E
1 | 1000 1110 |
数据编码
原码
- 定义:
- 最高位(最左边的一位)为符号位:
0表示正数,1表示负数。 - 其余位为数值位:表示这个数的绝对值的二进制形式。
- 最高位(最左边的一位)为符号位:
- 示例:
+5->0000 0101(符号位0,数值是5)-5->1000 0101(符号位1,数值是5)
- 优点:非常直观,容易理解。
- 缺点:
- 存在
+0和-0:0000 0000和1000 0000都表示0。这会造成歧义和计算上的麻烦。 - 运算复杂:CPU的电路设计会变得复杂。例如,做加法时,必须先判断两个数的符号位。如果符号不同,实际上要做的是减法,并且还要判断结果的符号。这大大降低了计算效率。
- 存在
反码
定义:
- 正数的反码:与其原码相同
- 负数的反码:将其对应正数的原码按位取反(包括符号位,但结果依然是1表示负)。
示例:
+5的原码是0000 0101,所以它的反码也是0000 0101-5的反码:先取+5的原码0000 0101,然后所有位按位取反(0变1,1变0),得到1111 1010
优点:引入反码后,减法可以用加法来实现。因为
X - Y等价于X + (-Y)缺点:
- 仍然存在
+0和-0**:+0的反码:0000 0000-0的反码:1111 1111
- 计算循环进位:用反码进行运算时,如果最高位有进位,需要把这个进位“循环”加到结果的最低位(称为“循环进位”或“端回进位”),电路实现仍然不够优雅
- 仍然存在
反码的核心贡献是:它首次实现了“将减法运算转换为加法运算”,从而简化了计算机内部运算器的设计。
补码
- 定义:
- 正数的补码:与其原码相同。
- 负数的补码:将其对应正数的原码按位取反后,再加1
- 示例(8位):
+5的补码:0000 0101(和原码一样)
-5的补码:- 取
+5的原码0000 0101 - 按位取反得到
1111 1010(这一步得到的是反码) - 再加1,得到
1111 1011
- 取
- 核心优点:
- 唯一的0:
0的补码只有一种表示:0000 0000。计算-0(即对0000 0000操作):取反1111 1111,加1后变成(1)0000 0000,最高位1溢出,剩下0000 0000,仍然是0。 - 无缝的加减法:可以将减法统一用加法来实现,不需要任何额外的判断和循环进位。CPU只需要设计一个加法器电路就可以同时处理加法和减法,极大地简化了硬件设计。
- 表示范围更合理:对于n位二进制,补码能表示的范围是 **[-2ⁿ⁻¹, 2ⁿ⁻¹ - 1]**。例如8位补码的范围是
-128到+127。比原码和反码的-127到+127多表示了一个数 (-128)。
- 唯一的0:
移码
- 定义:
- 在补码的基础上,将符号位取反
- 更通用的定义是:对一个数
X,将其加上一个固定的偏移值Offset(通常是2ⁿ⁻¹或2ⁿ⁻¹ - 1),然后再用二进制表示。
- 更通用的定义是:对一个数
- 在补码的基础上,将符号位取反
- 示例(8位,偏移量 Offset = 127)
+5:其补码是0000 0101。加上偏移量127后是132,132的二进制是1000 0100。-5:其补码是1111 1011。加上偏移量127后是122,122的二进制是0111 1010。
(如果采用“符号位取反”法:+5的补码是0000 0101,符号位取反得1000 0101;-5的补码是1111 1011,符号位取反得0111 1011。这种方法的结果与标准移码定义通常差1,但比较大小的特性一致)
- 核心优点:
便于比较:移码表示的所有数(正、负、零),其二进制的大小关系与它所代表的真值的大小关系是完全一致的。计算机可以直接用比较无符号整数的方式来比较移码的大小,速度极快。这对于浮点数运算中判断指数大小至关重要。
数值表示范围
| 码制 | 定点整数 | 定点小数 |
|---|---|---|
| 原码 | $-(2^{n-1}-1)$ ~ $(2^{n-1}-1)$ | $-(1-2^{-(n-1)})$ ~ $(1-2^{-(n-1)})$ |
| 反码 | $-(2^{n-1}-1)$ ~ $(2^{n-1}-1)$ | $-(1-2^{-(n-1)})$ ~ $(1-2^{-(n-1)})$ |
| 补码 | $-2^{n-1}$ ~ $(2^{n-1}-1)$ | -1 ~ $(1-2^{-(n-1)})$ |
| 移码 | $-2^{n-1}$ ~ $(2^{n-1}-1)$ | -1 ~ $(1-2^{-(n-1)})$ |
浮点数的运算
浮点数表示
计算机中通常使用科学计数法的二进制实现,可以在固定长度的存储空间中表示极大范围、不同精度的实数。
浮点数表示:$N = 尾数 \cdot 基数 ^ {指数}$
例如 $3.14 \times 10^3$
- 尾数:3.14
- 基数:10
- 指数:3
运算过程
例如 $3.14 \times 10^3 + 1.2 \times 10^5$
- 对阶,将两个数据的指数转换成相同的,小的往大的对
- $0.0314 \times 10^5 + 1.2 \times 10^5$
- 尾数计算
- $0.0314 + 1.2 = 1.2314$
- 结果格式化
- $1.2314 \times 10^5$
特点
- 尾数用补码,阶码用移码
- 阶码的位数决定数的表示范围,位数越多范围越大
- 尾数的位数决定数的有效精度,位数越多精度越大
- 对阶时,小数向大数看齐
- 对阶是通过较小数的尾数右移实现的






