Skip to content

第二章:信息的表示和处理

2.1 数制

十进制(DEC)十六进制(HEX)八进制(OCT)二进制(BIN)
0000
1111
22210
33311
444100
555101
666110
777111
88101000
99111001
10a121010
11b131011
12c141100
13d151101
14e161110
15f171111

其他进制转换为十进制

根据进制的权值,如一个 nn 位的 kk 进制数,从右往左数第一位是 00 位,那么其十进制数字表示是

S=i=0n1xikiS = \sum_{i=0}^{n-1}x_{i}k^{i}

十进制转其他进制

可以使用除法,例如转换为 kk 进制,每一次除以 kk,将余数写在一边,将除数写在下面继续除,直到除数为 00,这个时候将余数从下往上写出来就是这个数。

例如,将 (100)10(100)_{10} 转换为二进制数:

10050025012160301101\begin{aligned} 100 & & \\ 50 & \qquad \cdots & 0 \\ 25 & \qquad \cdots & 0 \\ 12 & \qquad \cdots & 1 \\ 6 & \qquad \cdots & 0 \\ 3 & \qquad \cdots & 0 \\ 1 & \qquad \cdots & 1 \\ 0 & \qquad \cdots & 1 \\ \end{aligned}

得到的结果是 (1100100)2=100(1100100)_{2} = 100

二进制与八进制、十六进制的转换

从右边数,每 44 个二进制数对应一个十六进制数,每 33 个二进制数对应一个八进制数,不足的可以补 00

text
0x    a    4    8    f    0    7
0b 1010 0100 1000 1111 0000 0111
text
0b 101 001 001 000 111 100 000 111
0o   5   1   1   0   7   4   0   7

2.2 原码、反码和补码

原码

最高位是符号位(00 表示正,11 表示负),其余的二进制位表示这个数的绝对值。

整数的原码与其值的关系:

[x]={x,0x<2n2nx,2n<x0[x]_{\text{原}} = \begin{cases} x, & 0 \leqslant x < 2^n \\ 2^n - x, & -2^n < x \leqslant 0 \end{cases}

反码

对于正数,反码与原码一致;对于负数,反码的数值部分是原码的二进制求反。

整数的反码与其值的关系:

[x]={x,0x<2n(2n+11)+x,2n<x0[Mod (2n+11)][x]_{\text{反}} = \begin{cases} x, & 0 \leqslant x < 2^n \\ (2^{n+1} - 1) + x, & -2^n < x \leqslant 0 \end{cases} \left[ \mathrm{Mod}\ (2^{n+1} - 1) \right]

补码

对于正数,补码与原码一致,对于负数,数值求反并加一。

整数的补码与其值的关系:

[x]={x,0x<2n2n+1+x,2n<x0[Mod 2n+1][x]_{\text{补}} = \begin{cases} x, & 0\le x < 2^n \\ 2^{n+1} + x, & -2^n < x \le 0 \end{cases} \left[ \mathrm{Mod}\ 2^{n+1} \right]

2.3 其他二进制表示

格雷码 相邻两位的变化只有一位。余三码 相当于 8421BCD 码加三。

十进制8421BCD格雷码余三码2421BCD
00000000000110000
10001000101000001
20010001101010010
30011001001100011
40100011001110100
50101011110001011
60110010110011100
70111010010101101
81000110010111110
91001110111001111
1010101111
1110111110
1211001010
1311011011
1411101001
1511111000

格雷码转自然二进制

自然二进制 BiB_i 与格雷码 GiG_i,那么

Bi=GiBi+1B_i = G_i \oplus B_{i+1}

其中,\oplus 是异或运算

自然二进制转格雷码

Gi=BiBi+1G_i = B_i \oplus B_{i+1}

余三码与自然二进制相互转换

由余三码定义可以得知,余三码的值减去三得到自然二进制。

2.4 浮点数表示

2.4.1 二进制小数

首先我们先看十进制的小数含义,对于下面的十进制数

dmdm1d1d0.d1d2dnd_m d_{m-1} \cdots d_1 d_0 . d_{-1} d_{-2} \cdots d_{-n}

其数值等于

i=nm10i×di\sum_{i=-n}^m 10^{i} \times d_i

这对于二进制也是一样的,对于一个二进制数

bmbm1b1b0.b1b2bnb_m b_{m-1} \cdots b_1 b_0 . b_{-1} b_{-2} \cdots b_{-n}

其数值等于

i=nm2i×bi\sum_{i=-n}^m 2^{i} \times b_i

我们知道,对于有符号(signed 类型)的数字,第一位使用符号位,对于浮点数也是这样。

2.4.2 IEEE 浮点数表示

32 位浮点数通常遵循 IEEE 754 标准,这个 IEEE 754 可视化网站 可以帮助你理解 IEEE 754。

IEEE754

设符号位为 SS,尾数为 MM,阶码为 EE,那么这个浮点数可以表示为

V=(1)S×M×2EV = (-1)^S \times M \times 2^E

其中 E=ebE = e - b 其中 ee 是绿色区域所表示的无符号数字,偏置 bb2bits112^{\mathrm{bits}-1} - 1。也就是说对于 32 位的浮点数,b=2811=127b = 2^{8-1}-1 = 127,对于 64 位的浮点数,b=21111=1023b = 2^{11-1}-1 = 1023

对于尾数,当为规格化时,隐含了一个 11 的表示。即对于 64 位浮点数,各个比特位是 1:11:521:11:52

浮点数的分类:

  1. 对于规格化的浮点数,E255,E0E \neq 255, E \neq 0
  2. 对于非规格化的浮点数,E=0E = 0
  3. 无穷大表示为 E=255,M=0E = 255,\, M = 0
  4. 不是一个数(NaN)表示为 E=255,M0E = 255, M \neq 0

对于下面几点特殊情况:

  • S=0S = 0M=0M = 0 时,没有隐含的 11,表示 +0.0+0.0
  • S=1S = 1M=0M = 0 时,没有隐含的 11,表示 0.0-0.0
  • 对于 S=0S = 0 时,E=255,M=0E = 255,\, M = 0 表示 ++\infty
  • 对于 S=1S = 1 时,E=255,M=0E = 255,\, M = 0 表示 -\infty