002 进制与编码

1 进制

1.1 进制的概念

编程本质上是一种与计算机进行沟通的方式,在日常生活中我们习惯于使用十进制(0-9)来表示数字,而当前计算机的硬件设计(如晶体管)注定了只能识别两种状态:开(1)和关(0),所以计算机只能使用二进制来表示数字,后续科学家们为了简化二进制,开发出来2的3次方(8进制)和2的4次方(16进制),但这都有悖于我们的日常习惯,所以我们为了与计算机更好的交流需要了解进制之间的转换关系至于八进制、十六进制则是因为用二进制表示实在是太长一串数字了,结合计算机中的单位才使用的。

image

由于不同的进制均是采用阿拉伯数字表示,所以科学家们为各个进制设计了一套特殊符号用以区分

2进制 0b1100101 以0b为起始的阿拉伯数字
8进制 0o27 以0o为起始的阿拉伯数字
10进制 112231 直接使用阿拉伯数字
16进制 0x1c 以0x为起始的阿拉伯数字,10-15以a-f表示

1.2 进制的转换

各个进制之间时刻以进行互相转换的,在python中,10进制是整形存在的,而其他的进制是字符串形式。

>>> print(type(25))
<class 'int'>
>>> print(type(bin(25))) # bin为二进制
<class 'str'>
>>> print(type(oct(25))) # oct为八进制
<class 'str'>
>>> print(type(hex(25))) # hex为十六进制
<class 'str'>

使用python的内置函数进行进制转换的时候,必须先将其他进制转换为10进制,然后再进行转换成二进制

# 其他进制转十进制
i1 = int("0b11001",base=2) # 25
i2 = int("0o27",base=8) # 23 
i3 = int("0x1c",base=16) # 28 
​
# 这种方法支持变量名
i1 = "0b11001"
# print(int(i1)) 直接转换不支持
print(int(i1,base=2))

但其实可以直接进行转换

# 其他进制转十进制
print(int(0b11001))
print(int(0o27))
print(int(0x1c))

# 其他进制转二进制
print(bin(25))
print(bin(0o27))
print(bin(0x1c))

# 其他进制转八进制
print(oct(23))
print(oct(0b11001))
print(oct(0x1c))

# 其他进制转十六进制
print(hex(23))
print(hex(0b11001))
print(hex(0o27))

1.3 计算机的单位

由于计算机中本质上所有的东西以为二进制存储和操作的,为了方便对于二进制值大小的表示,所以创造了在计算机中特有的一些单位。

b(bit),位 -> 指的是二进制的一个位数

1 -> 1位
10 -> 2位
111 -> 3位
1001 -> 4位

B(byte),字节

8位被称为一个字节

10010110,1个字节
10010110 10010110,2个字节

KB(kilobyte),千字节

1024个字节就是1个千字节

10010110 11010110  10010111 .. ,1KB
1KB = 1024B= 1024 * 8 b

M(Megabyte),兆

1024KB就是1M
1M= 1024KB = 1024 * 1024 B = 1024 * 1024 * 8 b

G(Gigabyte),千兆

1024M就是1G
1 G=  1024 M=  1024 *1024KB =  1024 * 1024 * 1024 B =  1024 * 1024 * 1024 * 8 b

T(Terabyte),万亿字节

1024个G就是1T

...其他更大单位 PB/EB/ZB/YB/BB/NB/DB 不再赘述。

注意:这里硬盘厂商觉得按照这个方式计算太亏了,故KB\M\G\T\ ... 做进制的时候,是按照1000为进制,所以1T的硬盘在计算机中显示没有一个1024G

类型转换并不会改变原来的值,而是会基于原来的值生成一个新的值,并将其存储在新的内存空间中。例如,对于整数 6,使用 str(6) 进行类型转换后,会生成一个新的字符串 "6",这个字符串 "6" 是基于整数 6 重新生成的,并且存储在新的内存空间中。原来的整数 6 仍然存在,且不会受到影响。

类型转换并不会改变原来的值,而是会基于原来的值生成一个新的值,并将其存储在新的内存空间中。例如,对于整数 6,使用 str(6) 进行类型转换后,会生成一个新的字符串 "6",这个字符串 "6" 是基于整数 6 重新生成的,并且存储在新的内存空间中。原来的整数 6 仍然存在,且不会受到影响。

2 编码

信息是多种多样的,它不只是整数,也包括文字、图像、声音、视频等等。为了能够让计算机理解和处理这些信息,科学家们发明了一种代指的方法,将一串二进制的数字绑定起来用于表示A,另一串二进制的数字表示B,以此类推,这样计算机就能够处理不同的信息类型来,我们将这种代指模式称为编码

image

由于各个国家的所生活的环境,使用的语言不同,所以计算机科学家们会根据计算机的性能和当地使用的习惯和环境,开发不同的编码集,在中国,我们最常见的叫做utf-8GBK编码,因为他支持大量的汉字

每种编码都有自己的一套密码本,都维护这自己的一套规则,如:
    utf-8编码:
        废     ->      11100101 10111010 10011111
        物     ->      11100111 10001001 10101001
    gbk编码:
        废     ->      10110111 11001111
        物     ->      11001110 11101111
所以,使用的不同的编码保存文件时,硬盘的文件中存储的0/1也是不同的。

注意事项:以某个编码的形式进行保存文件,以后就要以这种编码去打开这个文件。否则就会出现乱码。

UTF-8编码去保存废物:11100101 10111010 10011111 11100111 10001001 10101001
GBK编码形式去打开:乱码

3 编程初体验

通常Windows 系统支持 UTF-8 和 GBK 两种编码,默认使用 GBK 编码,而 Linux 系统默认使用 UTF-8 编码,我们在创建文件的时候,务必让编码保存和打开一致,否则会乱码。

默认的Python解释器为了兼容更多的情况,默认是以UTF-8编码的形式打开文件。如果想要修改Python的默认解释器编码,在代码中添加# -**- coding:gbk -**-告诉编辑器,它的编码格式。

# -*- coding:gbk -*-
print("我是你二大爷")

建议:所有Python代码文件的都要以UTF-8编码保存和读取。

image

posted @ 2025-09-03 00:14  kinghtxg  阅读(1)  评论(0)    收藏  举报