11---
2- date : 2026-03-13 11:47 :20
2+ date : 2026-03-16 02:09 :20
33title : 数据的表示
44permalink : data-pres
55publish : true
@@ -11,6 +11,282 @@ tags:
1111
1212## 数制与编码
1313
14+ ### 进制计数制
15+
16+ - ** 基数** ($r(2, 8, 10, 16)$): 表示该进制中每个数码位上可能的取值个数。数值逢 $r$ 进一
17+
18+ - ** 权重** ($w_i$): 表示该数码位上所代表的数值。例如,在十进制数 $123.45$ 中,$1$ 的权重为 $10^2$,$2$ 的权重为 $10^1$,$3$ 的权重为 $10^0$,$4$ 的权重为 $10^{-1}$,$5$ 的权重为 $10^{-2}$。
19+
20+ 计算机科学中常用的进制有二进制、八进制、十进制和十六进制:
21+
22+ | 二进制 | 八进制 | 十进制 | 十六进制 |
23+ | :-:| :-:| :-:| :-:|
24+ | $B$ | $O$ | $D$ | $H$ / $0x$ |
25+
26+ #### r进制转换为十进制
27+
28+ 各位数码位与其权值的乘积之和,即为该数对应的十进制数。
29+
30+ 例如,二进制数 $1011.01B$ 对应的十进制数为 $1 \times 2^3 + 0 \times 2^2 + 1 \times 2^1 + 1 \times 2^0 + 0 \times 2^{-1} + 1 \times 2^{-2} = 11.25$。
31+
32+ #### 二进制与八进制的相互转换
33+
34+ 每** 三个二进制位** 对应一个八进制位。以小数点为中心开始向两边看,每三位一组,转换为对应的八进制数,不足三位时,在高位补零。
35+
36+ #### 二进制与十六进制的相互转换
37+
38+ 与二进制与八进制的相互转换类似,每** 四个二进制位** 对应一个十六进制位。
39+
40+ #### 十进制转换为二进制
41+
42+ 将十进制数使用** 短除法** 拆分成 $2^n\ (n = 0, 1, \cdots)$ 之和即可。
43+
44+ !!! tip "短除法"
45+ 将十进制数除以 $2$,取余数,直到商为 $0$ 为止,将余数从下到上排列,即为对应的二进制数。
46+
47+ #### 十进制转换为八进制或十六进制
48+
49+ 先将十进制数转换为二进制数,在按照上面提到的方法转换为八进制或十六进制。
50+
51+ ### 编码
52+
53+ #### BCD编码
54+
55+ 二进制编码的十进制数(* Binary-Coded Decimal* ,BCD),指用** 四位二进制数** 来表示一个十进制数中的一个数码。
56+
57+ !!! example "8421码"
58+ 8421码是一种有权码,即每个二进制位上的权值为 $8, 4, 2, 1$。
59+
60+ | 十进制数 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
61+ |:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
62+ | 8421码 | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 |
63+
64+ 在使用8421码进行运算时,若计算结果不在上面的映射表中,则需要进行**十进制调整**,即加上 $6$($1010B$),高位组不满四位时,在高位继续补零。
65+
66+ !!! tip "加6调整的原因"
67+ 8421码有四个二进制位,可以表示 $16$ 种状态,而十进制只有 $10$ 种状态,有 $6$ 种状态没有被使用,因此需要加上 $6$ 进行调整,使得计算结果在8421码的映射表中。
68+
69+ #### ASCII码
70+
71+ ASCII码(* American Standard Code for Information Interchange* ),是一种** 7位二进制编码** (通常用 $8$ 位表示一个字符,最高位为 $0$),用于表示 $128$ 种字符。
72+
73+ 在ASCII码中:
74+
75+ - 所有数字、大写和小写字母被连续分配代码
76+
77+ - 常见的ACSII码:
78+
79+ - ` '0' ` : $(48)_ {10} = (30)_ {16} = (00110000)_ 2$
80+
81+ - ` 'A' ` : $(65)_ {10} = (41)_ {16} = (01000001)_ 2$
82+
83+ - ` 'a' ` : $(97)_ {10} = (61)_ {16} = (01100001)_ 2$
84+
85+ 若求存储单元存放的内容,则需要如上式所示使用 $8$ 位二进制数表示;但如果是问ASCII码(值),则需使用 $7$ 位二进制数表示。
86+
87+ #### 汉字的表示和编码
88+
89+ ![ ] ( assets/data-pres/chinese_code.jpg )
90+
91+ - ** 区位码** : 将汉字分为 $94$ 个区,每个区有 $94$ 个位,共 $94 \times 94 = 8836$ 个汉字。
92+
93+ 区位码的表示方法为:$区码 + 位码$,例如:` '中' ` 的区位码为 ` '1601' ` 。
94+
95+ - ** 国标码** (GB 2312 交换码): 在区位码基础上,将区码和位码各加上 $32$(即 $20H$),使每个字节落在可打印的图形字符范围内,便于传输与交换。
96+
97+ 公式:国标码 $=$ 区位码 $+ 2020H$(区码、位码分别加 $20H$)。例如:` '中' ` 的区位码为 $5448$(区 $54$、位 $48$,十六进制 $3630H$),国标码为 $5650H$。
98+
99+ - ** 汉字机内码** : 计算机内部存储汉字时使用的编码。
100+
101+ 在国标码基础上,将两个字节各加上 $128$(即 $80H$),使每个字节最高位为 $1$,从而与 ASCII 码(最高位为 $0$)区分,避免与西文冲突。公式:机内码 $=$ 国标码 $+ 8080H$。例如:` '中' ` 的国标码为 $5650H$,机内码为 $D6D0H$。
102+
103+ #### 字符串
104+
105+ - 字符串是按地址从高到低连续存储的多个字符的集合,通常以 ` '\0' ` 结尾
106+
107+ - 对于多字节的数据(如汉字),可采用大/小端模式存储
108+
109+ - 大端模式: 将数据的最高有效字节存放在低地址单元中
110+
111+ - 小端模式: 将数据的最高有效字节存放在高地址单元中
112+
113+ #### 校验码
114+
115+ 校验码是一种用于检测和纠正数据传输或存储过程中错误的技术。它通过在数据中添加冗余信息,以便在接收端进行错误检测和纠正。
116+
117+ 常用的校验码有:
118+
119+ - 奇偶校验码
120+
121+ - 海明码
122+
123+ - 循环冗余校验码(CRC)
124+
125+ ##### 奇偶校验码
126+
127+ 奇偶校验码是一种简单的校验码,它通过在数据中添加一个校验位,使得数据中 $1$ 的个数为奇数或偶数。
128+
129+ | 奇偶校验码 | 有效信息位 |
130+ | :-:| :-:|
131+ | $1$ 位 | $n$ 位 |
132+
133+ !!! example
134+ 例如,对于数据 $1011011$,其奇校验码为 $01011011$(原本有奇数个 $1$,校验位(最高位)为 $0$);偶校验码为 $11011011$(原本不是偶数个 $1$,校验位(最高位)为 $1$)。
135+
14136## 定点数的表示
15137
138+ ### 定点整数
139+
140+ 定点整数为** 纯整数** ,约定小数点的位置在有效数值部分最低位之后。
141+
142+ <div class =" arithmatex " >
143+ <table >
144+ <tr >
145+ <td style =" text-align :center " >x0</td >
146+ <td style =" text-align :center " >,</td >
147+ <td style =" text-align :center " >x1</td >
148+ <td style =" text-align :center " >x2</td >
149+ <td style =" text-align :center " >...</td >
150+ <td style =" text-align :center " >xn</td >
151+ <td style =" text-align :center " >.</td >
152+ </tr >
153+ <tr >
154+ <td style =" text-align :center " >符号位</td >
155+ <td style =" text-align :center " ></td >
156+ <td colspan =" 4 " style =" text-align :center " >数值部分</td >
157+ <td style =" text-align :center " >小数点(隐含)</td >
158+ </tr >
159+ </table >
160+ </div >
161+
162+ ### 定点小数
163+
164+ 定点小数为** 纯小数** (小于 $1$ 的小数),约定小数点的位置在符号位之后,有效数值部分最高位之前。
165+
166+ <div class =" arithmatex " >
167+ <table >
168+ <tr >
169+ <td style =" text-align :center " >x0</td >
170+ <td style =" text-align :center " >.</td >
171+ <td style =" text-align :center " >x1</td >
172+ <td style =" text-align :center " >x2</td >
173+ <td style =" text-align :center " >...</td >
174+ <td style =" text-align :center " >xn</td >
175+ </tr >
176+ <tr >
177+ <td style =" text-align :center " >符号位</td >
178+ <td style =" text-align :center " >小数点(隐含)</td >
179+ <td colspan =" 4 " style =" text-align :center " >数值部分</td >
180+ </tr >
181+ </table >
182+ </div >
183+
184+ ### 原码、反码、补码、移码之间的转换
185+
186+ ![ ] ( assets/data-pres/4_codes.jpg )
187+
188+ !!! example
189+ <div class =" responsive-video-container " >
190+ <iframe src="https://player.bilibili.com/player.html?isOutside=true&aid=113966823117737&bvid=BV1taNuerEVq&p=3&t=1336&autoplay=0 "
191+ scrolling="no"
192+ border="0"
193+ frameborder="no"
194+ framespacing="0"
195+ allowfullscreen="true">
196+ </iframe >
197+ </div >
198+
199+
200+ #### 原码表示法
201+
202+ 用机器数的最高位表示符号($0$ 表示正数,$1$ 表示负数),其余位表示数值的绝对值。
203+
204+ !!! warning "真值零"
205+ 原码表示法中,真值 $0$ 有两种表示方法: $[ +0] _ {原} = 0,000$ 和 $[ -0] _ {原} = 1,000$。
206+
207+ #### 反码表示法
208+
209+ - 正数的反码与原码相同
210+
211+ - 负数的反码为原码的每一位取反(符号位除外)
212+
213+ 同理,真值 $0$ 也有两种表示方法: $[ +0] _ {反} = 0,000$ 和 $[ -0] _ {反} = 1,111$。
214+
215+ #### 补码表示法
216+
217+ - 正数的补码与原码相同
218+
219+ - 负数的补码为原码的每一位取反(符号位除外),然后加 $1$
220+
221+ !!! tip
222+ - 补码的定义也可以“逆着用”,即“取反加一”也可以用于补码转换为原码。
223+
224+ - 真值零的补码只有一种表示方法: $[+0]_{补} = 0,000$。
225+
226+ #### 移码表示法
227+
228+ 将补码的符号位取反,即可得到移码。
229+
230+ !!! tip
231+ - ** 移码只能用于表示定点整数(多用于表示浮点数的阶码)**
232+
233+ - 基于移码的定义和补码的特性,移码的真值零也只有一种表示方法: $[+0]_{移} = 1,000$
234+
235+ ### 原码、反码、补码、移码的表示范围
236+
237+ #### 定点整数
238+
239+ - 原码表示法:$-2^{n-1} \le [ x] _ {原} \le +2^{n-1} - 1$
240+
241+ - 反码表示法:$-2^{n-1} \le [ x] _ {反} \le +2^{n-1} - 1$
242+
243+ - 补码表示法:$-2^{n} \le [ x] _ {补} \le +2^{n-1} - 1$
244+
245+ - 移码表示法:$-2^{n} \le [ x] _ {移} \le +2^{n-1} - 1$
246+
247+ #### 定点小数
248+
249+ - 原码表示法:$-(1 - 2^{-n}) \le [ x] _ {原} \le +(1 - 2^{-n})$
250+
251+ - 反码表示法:$-(1 - 2^{-n}) \le [ x] _ {反} \le +(1 - 2^{-n})$
252+
253+ - 补码表示法:$-1 \le [ x] _ {补} \le +1 - 2^{-n}$
254+
16255## 浮点数的表示
256+
257+ 浮点数是一种表示实数的方法,它将实数表示为** 尾数** 和** 阶码** 的乘积。
258+
259+ $$
260+ N = M \times R^E
261+ $$
262+
263+ 其中,
264+
265+ - $r$ 是浮点数阶码的底(隐含),与尾数的基数相同,通常为 $2$
266+
267+ - $M$ 和 $E$ 分别是尾数和阶码,都是有符号的定点数
268+
269+ | $J_f$ | $J_1 J_2 J_m$ | $S_f$ | $S_1 S_2 S_n$ |
270+ | :-:| :-:| :-:| :-:|
271+ | 阶码符号位 | 阶码数值部分 | 尾数符号位 | 尾数数值部分 |
272+
273+ !!! tip
274+ - 阶码是整数,阶符 $J_f$ 和阶码的位数 $m$ 共同决定浮点数的表示范围和小数点的实际位置
275+
276+ - 数符 $S_f$ 表示浮点数的符号,尾数的位数 $n$ 决定浮点数的精度
277+
278+ ### 规格化浮点数
279+
280+ ### IEEE 754标准
281+
282+ | $m_s$ | $E$ | $M$ |
283+ | :-:| :-:| :-:|
284+ | 数符 | 阶码(移码表示) | 尾数(原码表示) |
285+
286+ IEEE 754标准规定的常用的浮点数有短浮点数($32$ 位, ` float ` )、长浮点数($64$ 位, ` double ` )和临时浮点数($128$ 位):
287+
288+ | 类型 | 符号位 | 阶码 | 尾数数值 | 偏置值 |
289+ | :-:| :-:| :-:| :-:| :-:|
290+ | 短浮点数 | $1$ | $8$ | $23$ | $7FH$($127_ {10}$) |
291+ | 长浮点数 | $1$ | $11$ | $52$ | $3FFH$($1023_ {10}$) |
292+ | 临时浮点数 | $1$ | $15$ | $112$ | $3FFFH$($16383_ {10}$) |
0 commit comments