文章目录
本节主要是计算机中数的表示和编码部分
1 进制/编码转换
1.1 不同进制之间转换
1. 二进制转十进制
原理:
整数部分和上述相同
小数部分每位乘以2的负幂次,然后求和。
例子:二进制数 110.101
转换为十进制:
整数部分:
1
×
2
2
+
1
×
2
1
=
4
+
2
=
6
1 \times 2^2 + 1 \times 2^1 = 4 + 2 = 6
1×22+1×21=4+2=6
小数部分:
1
×
2
−
1
+
0
×
2
−
2
+
1
×
2
−
3
=
0.5
+
0
+
0.125
=
0.625
1 \times 2^{-1} + 0 \times 2^{-2} + 1 \times 2^{-3} = 0.5 + 0 + 0.125 = 0.625
1×2−1+0×2−2+1×2−3=0.5+0+0.125=0.625
所以,二进制 110.101
等于十进制的 6.625
。
2. 十进制转二进制
原理:
整数部分不断将十进制数除以2,记录下余数,最后的二进制数是这些余数的逆序排列
小数部分通过不断乘以2然后取整数部分来转换。
例子:十进制数 13.625
转换为二进制:
整数部分:
十进制数 13
转换为二进制:
- 13 ÷ 2 = 6 余 1
- 6 ÷ 2 = 3 余 0
- 3 ÷ 2 = 1 余 1
- 1 ÷ 2 = 0 余 1
所以,十进制 13
等于二进制的 1101
。
小数部分:0.625 × 2 = 1.25 → 1, 0.25 × 2 = 0.5 → 0, 0.5 × 2 = 1 → 1
所以,十进制 10.625
等于二进制的 1101.101
。
3. 八进制转十进制
原理:和二进制到十进制相同,但用8的幂次。
例子:八进制数 23.4
转换为十进制:
整数部分:
2
×
8
1
+
3
×
8
0
=
16
+
3
=
19
2 \times 8^1 + 3 \times 8^0 = 16 + 3 = 19
2×81+3×80=16+3=19
小数部分:
4
×
8
−
1
=
0.5
4 \times 8^{-1} = 0.5
4×8−1=0.5
所以,八进制 23.4
等于十进制的 19.5
。
4. 十进制转八进制
原理:和十进制到二进制相同
但整数部分除以8看余数
小数部分乘以8 取整数
例子:十进制数 45.625
转换为八进制:
整数部分:45 转换为 55
小数部分:0.625 × 8 = 5 → 5
所以,十进制 45.625
等于八进制的 55.5
。
5. 十六进制转十进制
原理:和二进制到十进制相同,但用16的幂次。
例子:十六进制数 2F.A
转换为十进制:
整数部分:
2
×
1
6
1
+
15
×
1
6
0
=
32
+
15
=
47
2 \times 16^1 + 15 \times 16^0 = 32 + 15 = 47
2×161+15×160=32+15=47
小数部分:
10
×
1
6
−
1
=
0.625
10 \times 16^{-1} = 0.625
10×16−1=0.625
所以,十六进制 2F.A
等于十进制的 47.625
。
6. 十进制转十六进制
原理:和十进制到二进制相同,但除以16和乘以16。
例子:十进制数 75.8
转换为十六进制:
整数部分:75 转换为 4B
小数部分:0.8 × 16 = 12.8 → C, 0.8 × 16 = 12.8 → C(重复)
所以,十进制 75.8
等于十六进制的 4B.C
(重复)。
7 二进制转八进制
原理:整数部分从右向左每三位一组,小数部分从左向右每三位一组,不足三位的补零。注意补零的方向不一样,整数开头补0,小数部分末尾补零,例如整数部分10,则补充为010,小数部分10,则补充维100
例子:二进制数 110110.1101
转换为八进制。
- 整数部分(从右向左分组):
110 110
→110 110
- 小数部分(从左向右分组):
110 100
→110 100
(末尾补零) - 转换每组:整数部分
110
为八进制的6
,110
为6
;小数部分110
为6
,100
为4
- 所以,二进制
110110.1101
等于八进制的66.64
。
8 二进制转十六进制
原理:整数部分从右向左每四位一组,小数部分从左向右每四位一组,不足四位的补零。
例子:二进制数 110110.1101
转换为十六进制。
- 整数部分(从右向左分组):
0110 110
→0110 1100
(前面补零) - 小数部分(从左向右分组):
1101 0000
→1101 0000
(末尾补零) - 转换每组:整数部分
0110
为十六进制的6
,1100
为C
;小数部分1101
为D
,0000
为0
- 所以,二进制
110110.1101
等于十六进制的6C.D0
。
1.2 不同编码之间转换
机器数编码主要有原码,反码和补码
其中
正数:原,反,补相同
负数:原,反,补不同,但最高位都为1。
每种表示法的处理方式如下:
-
原码:最高位设为1表示负数,其余位表示数值本身。例如,-5的原码表示(假设使用8位)为
10000101
。 -
反码:对于负数,最高位保持为1,其余位是原码的逐位取反(即1变0,0变1)。例如,-5的反码表示为
11111010
。这是因为5的原码为00000101
,取反后得到11111010
。 -
补码:负数的补码是其反码加1。补码用于简化加法和减法操作,因为它允许使用相同的加法硬件来处理正数和负数的加法。例如,-5的补码表示为
11111011
。这是因为-5的反码是11111010
,加1后得到11111011
。
所以着重看负数的各种转换情况
负数:
原→反, 符号位不变,尾数按位求反
原→补 ,符号位不变,尾数按位求反+1
补→原, 符号位不变,尾数求反+1
反→原 ,符号位不变,尾数求反.
2 字符编码表示
2.1 小数表示
在计算机科学中,小数的表示主要有两种形式:定点表示和浮点表示。这两种表示方法各有特点,适用于不同的应用场景。
2.1.1 定点表示
定点表示法将小数点的位置固定在某个位置。在这种表示中,小数部分和整数部分的长度是预先设定的。定点表示法通常用于那些小数点位置固定且精度要求不高的应用。
例子:
假设我们使用一个8位的定点表示法,其中前4位用于整数部分,后4位用于小数部分。那么:
- 数字
5.625
可以表示为0101.1010
。这里0101
表示整数部分的5
,1010
表示小数部分的.625
(即5/8
)。
2.1.2 浮点表示
浮点表示法是一种更为复杂但灵活的表示方法,它允许小数点的位置随数值的大小而变化。
这种表示方式由三部分组成:符号位(表示正负)、指数部分(决定小数点的位置)和尾数部分(表示实际数字)。
例子:
以IEEE 754标准的32位单精度浮点表示为例,一个浮点数如 5.625
可以表示为:
- 符号位:0(因为是正数)
- 指数部分:用于移动小数点。例如,
5.625
转换为二进制是101.101
,标准化(即使其成为1.xxx形式)后为1.01101
乘以2^2
。因此,指数部分是2
(实际存储时,指数会加上偏移量,对于32位单精度,偏移量是127,所以存储的指数值是129,或二进制10000001
)。 - 尾数部分:去掉小数点前的
1
,余下01101
。在32位单精度中,尾数部分有23位,不足的部分补0。
综上,5.625
的浮点表示(近似)为:0 10000001 01101000000000000000000
。
总结来说,定点表示适用于固定精度需求,而浮点表示更适合表示广泛的数值范围和不同的精度要求,尤其是在科学计算和工程领域中。浮点表示虽然灵活,但也可能引入舍入误差。
2.2 汉字编码
以下是常见的汉字字符集编码:
GB2312编码:1981年5月1日实施的简体中文汉字编码国家标准。GB2312对汉字采用双字节编码,收录7445个图形字符,其中包括6763个汉字。自2017年3月23日起,该标准转化为推荐性标准:GB/T2312-1980,不再强制执行。
BIG5编码:台湾地区繁体中文标准字符集,采用双字节编码,共收录13053个中文字,1984年实施。
GBK编码:1995年12月发布的汉字编码国家标准,是对GB2312编码的扩充,对汉字采用双字节编码。GBK字符集共收录21003个汉字,包含国家标准GB13000-1中的全部中日韩汉字,和BIG5编码中的所有汉字。
Unicode编码:国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言、跨平台的文本信息转换。Unicode采用四个字节为每个字符编码。