1. 进制的种类
数字在计算机中表现的方式常见的有四种:十进制、二进制、八进制、十六进制
1.1 十进制
1)基数:0,1,2,3,4,5,6,7,8,9
2)进位:逢10进1
3)位权:10的n次方 (n从低位到高位从0开始依次增加)
1231 = 1*10^3 + 2*10^2 + 3*10^1 + 1*10^0
4)程序中的表示方式:直接写
123
100
1.2 二进制
1)基数:0,1
2)进位:逢2进1
"""
11011 + 10111 = 110010
1011 + 111010 = 1000101
"""
3)位权:2的n次方 (n从低位到高位从0开始依次增加)
101011 = 2^5 + 2^3 + + 2^1 + 2^0 = 32 + 8 + 2 + 1 = 43
4)程序中的表示方式:二进制数前加 0b或者0B
0b101
0B1010011
0b102
1.3 八进制
1)基数:0,1,2,3,4,5,6,7
2)进位:逢8进1
"""
76 + 45 = 143
"""
3)位权:8的n次方 (n从低位到高位从0开始依次增加)
123 = 1*8^2 + 2*8^1 + 3*8^0 = 64 + 16 + 3 = 83
4)程序中的表示方式:八进制数前加 0o或者0O
0o10
0O27
1.4 十六进制
1)基数:0,1,2,3,4,5,6,7,8,9,a/A,b/B, c/C, d/D, e/E, f/F
2)进位:逢16进1
"""
9 + 6 = F
7 + 9 = 10
"""
3)位权:16的n次方 (n从低位到高位从0开始依次增加)
123 = 16^2 + 2*16^1 + 3*16^0 == 256 + 32 + 3 = 291
4)程序中的表示方式:十六进制数前加 0x或者0X
0x9afdab
0x8AabF1
注意:十进制数能做的事情其他的进制数都可以做
print(291 + 1)
print(0x123 + 1)
2. 不同进制之间的相互转换
2.1 其他进制转十进制
"""
0b1011 -> 2^0 + 2^1 + 2^3 = 1 + 2 + 8 = 11
0o12 -> 2*8^0 + 1*8^1 = 10
0xaf -> 15*16^0 + 10*16^1 = 175
"""
print(0b1011)
print(0o12)
print(0xaf)
2.2 十进制转其他进制
"""
100 -> 0b1100100
100 -> 0o144
100 -> 0x64
"""
print(0b1100100, 0o144, 0x64)
2.3 八进制、十六进制与二进制之间的相互转换:
八进制转二进制: 将1位8进制数转换成3位的二进制
十六进制转二进制: 将1位16进制数转换成4位的二进制
0o67 -> 0b110 111
0o624 -> 0b110 010 100
0xaf -> 0b1010 1111
0xf21 -> 0b1111 0010 0001
0xa8e4 -> 0b1010 1000 1110 0100
二进制转八进制:将3位的2进制数转换成1位的8进制
二进制转十六进制:将4位的2进制数转换成1位的16进制
0b011 010 111 011 -> 0o3273
0b0110 1011 1011 -> 0x6bb
2.4. 代码转换
print(bin(0o67))
print(hex(100))
3.原码、反码和补码
计算机存储数据的时候存的是数字的补码,正数的原码、反码和补码一样
3.1 原码
原码 = 符号位+真值
符号位:最高位表示符号位(0表示正,1表示负)
真值:数字的绝对值的二进制
10的原码:00001010
-256的原码:10000001 00000000
56的原码:00111000
`print(0b10101011)`
3.2 负数的反码 - 原码符号位不变其余位取反
-10的反码:11110101
-3的反码:10000011(原) -> 11111100(反)
-2的反码:10000010(原) -> 11111101(反)
3.3 负数的补码 - 反码加1
计算机在存储和操作数据的时候使用的是原码,查看结果的时候用原码
-2的补码:11111110
-3的补码:11111101
"""
计算机在对负数进行加法运算的时候结果不对,需要通过补码进行运算(计算机没有减法器只有加法器)
3 - 2 = 1
00000011(原) + 10000010(原) = 10000101(原码) -> -5(错)
00000011(补) + 11111110(补) = 000000001(补) -> 000000001(原) -> 1(对)
"""
3.4内存大小
位(bit)
字节(byte): 1字节 == 8位
1kb = 1024字节
1Mb = 1024kb
1G = 1024Mb
1T = 1024G
程序员编程能操作的内存的最小单位是字节:malloc(字节)