Python 学习之进制与编码
进制
日常生活中,我们最熟悉的数据就是十进制计数。它的数值部分由十个不同的数字符号0、1、2、3、4、5、6、7、8、9来表示,我们把这些数字符号叫做数码,表示十种不同的状态。数码处于不同的位置(或数位)代表的意义是不同的。
二进制数的含义
二进制数的每个数位只可能取两个不同的数码"0"和"1",而且是"逢二进一"。为了熟悉二进制数的表示,我们就几个简单的数字,列出二进制数与其对应的十进制数。
正如十进制数据中最大的数码是9一样,在二进制数据中最大的数码是1。也就是说,在二进制数数据中,不能出现2或者比2大的数码;否则就是错误的数据。这一点初学者尤其应该注意。
八进制数的表示
八进制数的基数为8,具有八个数码,逢八进一,计数如下:
0,1,2,3,4,5,6,7,10,11,12,13,14,15,16,17,20,21,22,23,24,25,26,27,30,31,32,33……
十六进制数的表示
十六进制数的基数为16,具有16个数码,逢16进一,计数如下:
0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,10,11,12,13,14,15,16,17,18,19,1A,1B…… 进制转换 要把一个十进制数转换为二进制数,首先把这个数以小数点为界分为两部分。对于整数部分是对该数除以2,记下它的余数,如果其商不等于0,再对其商除以2,仍然记下余数,重复此过程,直到商为零为止。倒序(先出来的余数写在最右边,依次类推,最后的余数写在最左边)写下所有余数,这个由余数构成的序列就是这个整数对应的二进制数;对于小数部分,则需要对该小数乘以2,记下它的整数部分,去掉整数部分后,如果余下的小数部分不为零,再对小数部分乘以2,再记下其整数部分,重复此过程,直到小数部分为零为止。顺次记下每次的整数部分就是这个数小数部分的二进制结果。
把该数整数部分的二进制结果和小数部分的二进制结果组合起来就是这个数据对应的二进制结果。
值得注意的是:并不是所有的有限位十进制数都能转换成有限位二进制数,对于这种情况,根据精度要求,保留一定的精度就可以了。
在计算机内部所有的信息都以二进制的形式进行存放、处理与传送,但在书写时可以以八进制和十六进制表示,这是因为二进制与八进制和十六进制之间的转换是很方便的。
由于十六进制的基数是16,八进制的基数是8,将十六进制数和八进制数转换为十进制和对二进制数求大小的方法相同,仍然采用将各数码乘以该位的权值,然后再取和的方法。
下面我们看简单数据的各种进制之间的转换关系:
(1)十六进制、八进制数与二进制数的直接转换
由于2的四次幂是16,2的三次幂是8,因此一位16进制数对应与四位二进制,一位八进制数对应三位二进制数。
为了将二进制数转化为十六进制数,只需从小数点开始向前,每四位一组划开,再从小数点向后,也是每四位一组划开,若小数点右边的最后一组不够四位,则添0补足四位,然后可以从上表中查到每一组对应的16进制数,依次写出来就可以了。同样的方法,若要将二进制数转化为八进制数,只需从小数点开始向前,每三位一组划开,再从小数点向后,也是每三位一组划开,若小数点右边的最后一组不够三位,则添0补足三位,然后从上表中查到每一组对应的八进制数,依次写出来就行了。
如果要将八进制数转换为二进制,则只要把每个八进制位用相应的三位二进制数代替。 当然,对于上表中不够三位的数据,前边以0补足。例如:八进制的1要变成001,八进制的2要变成010,等等。同理,如果要将十六进制数转换为二进制,则只要将每个十六进制位用相应的四位二进制数代替,对于上表中不够四位的数据,也是在前边以0补足。例如,16进制的1要转换为0001,16进制的2要转换为0010,等等。
由此可见,八进制或十六进制数与二进制数之间的转换极为方便,而且用八进制或者十六进制书写数据要比二进制简短,口读也方便。因此八进制或十六进制数常用于指令的书写、手编程序或者目标程序的输入、输出。特别指出的是:计算机数据的存储和传输基本上以字节为单位,一个字节包含8个二进制位,正好是两位十六进制数,因此十六进制数在计算机的程序开发和内存管理程序中得到了极为广泛的应用。
在计算机界,为了标志不同数制的数据,一般在数据末尾使用特殊的标记。以D或不标记表示十进制数据,以B表示二进制数据,以H表示十六进制数据,以O表示八进制数据。例如:18H,则表示十六进制数据18,其等价于十进制数据24。17O则表示八进制的数据17,其值等价于十进制数15。
进制生活小应用
硬盘空间少比买的时候要少,
是因为换算时他们将 1024 按照 1000来算
500G的硬盘: Bytes:按1000来算
500G 硬盘
1K = 1000B
1M = 1000K
1G = 1000M = 1000*1000*1000B =100
500000000000/1024/1024/1024 B = 465.66128730773926 B
百兆宽带,下载速度只能达到十多兆。
宽带运营商按照二进制来计算,所以要100M的宽带要除8才是下载的速度。
32位和64位 /32bit和64bit的区别
1. 对操作系统来说,64位和32位指最大内存寻址空间,32位最大4GB(2^32),64位理论上16EB(2^64),但现在一般都是2^48
2、对硬件来说,64位和32位指数据宽度,64位一次取8字节y也就是64bit,32取4字节也就是32bit,所以理论上64位比32位性能提高了一倍。
实际上的情况是,达不到,内存变大了,需要寻址更多。
3、对应用程序来说,应用程序基于操作系统 和硬件,其使用的指令宽度随系统和硬件变化。
32位和64位区别的最常见表现就是64万位操作系统可以支持4G以上的内存。缺点也是内存占用,64位代码比32位代码多占用空间,
现在来看64位操作系统兼容32位软件。反之则不行。
32位和64位最本质的区别是CPU来决定的,操作系统的位数是是看最大能把CPU的性能发挥到多高。我们现在在市面上见到的CPU都是64位的,32位的CPU已经是老古董了。
编码
编码单位
位 bit (比特)(Binary Digits):存放一位二进制数,即 0 或 1,最小的存储单位。
字节 byte:8个二进制位为一个字节(B),最常用的单位。
1B(bytes) = 8bit
1KB (Kilobyte 千字节)=1024B,
1MB (Megabyte 兆字节 简称“兆”)=1024KB,
1GB (Gigabyte 吉字节 又称“千兆”)=1024MB,
1TB(Trillionbyte 万亿字节 太字节)=1024GB,
1PB(Petabyte 千万亿字节 拍字节)=1024TB,
1EB(Exabyte 百亿亿字节 艾字节)=1024PB,
1ZB (Zettabyte 十万亿亿字节 泽字节)= 1024 EB,
1YB (Yottabyte 一亿亿亿字节 尧字节)= 1024 ZB,
1BB (Brontobyte 一千亿亿亿字节)= 1024 YB
进制
Binary(2)
|
Octal(8)
|
Decimal(10)
|
Hex(16)
|
0
|
0
|
0
|
00
|
1
|
1
|
1
|
1
|
10
|
2
|
2
|
2
|
11
|
3
|
3
|
3
|
100
|
4
|
4
|
4
|
101
|
5
|
5
|
5
|
110
|
6
|
6
|
6
|
111
|
7
|
7
|
7
|
1000
|
10
|
8
|
8
|
1001
|
11
|
9
|
9
|
1010
|
12
|
10
|
A
|
1011
|
13
|
11
|
B
|
1100
|
14
|
12
|
C
|
1101
|
15
|
13
|
D
|
1110
|
16
|
14
|
E
|
1111
|
17
|
15
|
F
|
上层字符
编码分类
ASCII
八进制
|
十六进制
|
十进制
|
字符
|
八进制
|
十六进制
|
十进制
|
字符
|
0
|
0
|
0
|
nul
|
100
|
40
|
64
|
@
|
1
|
1
|
1
|
soh
|
101
|
41
|
65
|
A
|
2
|
2
|
2
|
stx
|
102
|
42
|
66
|
B
|
3
|
3
|
3
|
etx
|
103
|
43
|
67
|
C
|
4
|
4
|
4
|
eot
|
104
|
44
|
68
|
D
|
5
|
5
|
5
|
enq
|
105
|
45
|
69
|
E
|
6
|
6
|
6
|
ack
|
106
|
46
|
70
|
F
|
7
|
7
|
7
|
bel
|
107
|
47
|
71
|
G
|
10
|
8
|
8
|
bs
|
110
|
48
|
72
|
H
|
11
|
9
|
9
|
ht
|
111
|
49
|
73
|
I
|
12
|
0a
|
10
|
nl
|
112
|
4a
|
74
|
J
|
13
|
0b
|
11
|
vt
|
113
|
4b
|
75
|
K
|
14
|
0c
|
12
|
ff
|
114
|
4c
|
76
|
L
|
15
|
0d
|
13
|
er
|
115
|
4d
|
77
|
M
|
16
|
0e
|
14
|
so
|
116
|
4e
|
78
|
N
|
17
|
0f
|
15
|
si
|
117
|
4f
|
79
|
O
|
20
|
10
|
16
|
dle
|
120
|
50
|
80
|
P
|
21
|
11
|
17
|
dc1
|
121
|
51
|
81
|
Q
|
22
|
12
|
18
|
dc2
|
122
|
52
|
82
|
R
|
23
|
13
|
19
|
dc3
|
123
|
53
|
83
|
S
|
24
|
14
|
20
|
dc4
|
124
|
54
|
84
|
T
|
25
|
15
|
21
|
nak
|
125
|
55
|
85
|
U
|
26
|
16
|
22
|
syn
|
126
|
56
|
86
|
V
|
27
|
17
|
23
|
etb
|
127
|
57
|
87
|
W
|
30
|
18
|
24
|
can
|
130
|
58
|
88
|
X
|
31
|
19
|
25
|
em
|
131
|
59
|
89
|
Y
|
32
|
1a
|
26
|
sub
|
132
|
5a
|
90
|
Z
|
33
|
1b
|
27
|
esc
|
133
|
5b
|
91
|
[
|
34
|
1c
|
28
|
fs
|
134
|
5c
|
92
|
\
|
35
|
1d
|
29
|
gs
|
135
|
5d
|
93
|
]
|
36
|
1e
|
30
|
re
|
136
|
5e
|
94
|
^
|
37
|
1f
|
31
|
us
|
137
|
5f
|
95
|
_
|
40
|
20
|
32
|
sp
|
140
|
60
|
96
|
'
|
41
|
21
|
33
|
!
|
141
|
61
|
97
|
a
|
42
|
22
|
34
|
"
|
142
|
62
|
98
|
b
|
43
|
23
|
35
|
#
|
143
|
63
|
99
|
c
|
44
|
24
|
36
|
$
|
144
|
64
|
100
|
d
|
45
|
25
|
37
|
%
|
145
|
65
|
101
|
e
|
46
|
26
|
38
|
&
|
146
|
66
|
102
|
f
|
47
|
27
|
39
|
`
|
147
|
67
|
103
|
g
|
50
|
28
|
40
|
(
|
150
|
68
|
104
|
h
|
51
|
29
|
41
|
)
|
151
|
69
|
105
|
i
|
52
|
2a
|
42
|
*
|
152
|
6a
|
106
|
j
|
53
|
2b
|
43
|
+
|
153
|
6b
|
107
|
k
|
54
|
2c
|
44
|
,
|
154
|
6c
|
108
|
l
|
55
|
2d
|
45
|
-
|
155
|
6d
|
109
|
m
|
56
|
2e
|
46
|
.
|
156
|
6e
|
110
|
n
|
57
|
2f
|
47
|
/
|
157
|
6f
|
111
|
o
|
60
|
30
|
48
|
0
|
160
|
70
|
112
|
p
|
61
|
31
|
49
|
1
|
161
|
71
|
113
|
q
|
62
|
32
|
50
|
2
|
162
|
72
|
114
|
r
|
63
|
33
|
51
|
3
|
163
|
73
|
115
|
s
|
64
|
34
|
52
|
4
|
164
|
74
|
116
|
t
|
65
|
35
|
53
|
5
|
165
|
75
|
117
|
u
|
66
|
36
|
54
|
6
|
166
|
76
|
118
|
v
|
67
|
37
|
55
|
7
|
167
|
77
|
119
|
w
|
70
|
38
|
56
|
8
|
170
|
78
|
120
|
x
|
71
|
39
|
57
|
9
|
171
|
79
|
121
|
y
|
72
|
3a
|
58
|
:
|
172
|
7a
|
122
|
z
|
73
|
3b
|
59
|
;
|
173
|
7b
|
123
|
{
|
74
|
3c
|
60
|
<
|
174
|
7c
|
124
|
|
|
75
|
3d
|
61
|
=
|
175
|
7d
|
125
|
}
|
76
|
3e
|
62
|
>
|
176
|
7e
|
126
|
~
|
77
|
3f
|
63
|
?
|
177
|
7f
|
127
|
del
|
GB2312
GBK
BIG5
GB18030
ANSI编码
Unicode
UTF-8 编码
UTF-16 和 UTF-32 编码
base64编码