进位计数制
进制(数制)是表示数字的一种方式,它规定了数字的表示方法和运算规则。常见的进制包括二进制、八进制、十进制和十六进制。每种进制都有其特定的基数(即每个数位上可以使用的数字个数)和表示方法。
一、进制的基本概念
-
基数(Base)
基数是指一个进制中可以使用的不同数字的个数。例如,十进制的基数是10,因为它使用0到9这10个数字。
-
数位(Digit)
数位是指数字在数中的位置。每个数位上的值乘以该数位的权重(基数的幂)来确定其实际值。
-
权重(Weight)
权重是指每个数位的值在整体数值中的贡献。权重通常是基数的幂。
例如,在十进制数123中,
数位3的权重是10^0
数位2的权重是10^1
数位1的权重是10^2
二、常见的进制
-
十进制(Decimal)
-
基数:10
-
数字:0, 1, 2, 3, 4, 5, 6, 7, 8, 9
-
表示方法:每个数位的值乘以10的幂。例如,十进制数123表示为:
1×10^2+ 2×10^1+ 3×10^0=100+20+3=123
-
特点:十进制是人类最常用的进制,因为它符合人类的自然计数习惯。
-
-
二进制(Binary)
-
基数:2
-
数字:0, 1
-
表示方法:每个数位的值乘以2的幂。例如,二进制数1011表示为:
1×2^3+ 0×2^2+ 1×2^1+ 1×2^0=8+0+2+1=11
-
特点:二进制是计算机内部使用的进制,因为计算机的硬件电路只有两种状态(开和关,即0和1)。
-
-
八进制(Octal)
-
基数:8
-
数字:0, 1, 2, 3, 4, 5, 6, 7
-
表示方法:每个数位的值乘以8的幂。例如,八进制数123表示为:
1×8^2+ 2×8^1+ 3×8^0=64+16+3=83
-
特点:八进制常用于早期的计算机系统中,因为每个八进制数位可以表示3个二进制数位,便于转换。
-
-
十六进制(Hexadecimal)
-
基数:16
-
数字:0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F(其中A=10, B=11, C=12, D=13, E=14, F=15)
-
表示方法:每个数位的值乘以16的幂。例如,十六进制数1A3表示为:
1×16^2+ A×16^1+ 3×16^0=256+160+3=419
-
特点:十六进制常用于现代计算机系统中,因为每个十六进制数位可以表示4个二进制数位,便于转换和表示较大的数值。
-
三、进制之间的转换
-
二进制与十进制之间的转换
-
二进制转十进制:将二进制数的每一位乘以对应的2的幂,然后求和。例如,二进制1011转换为十进制:
1×2^3+ 0×2^2+ 1×2^1+ 1×2^0=8+0+2+1=11
-
十进制转二进制:将十进制数不断除以2,记录每次的余数,直到商为0,然后将余数倒序排列。例如,十进制11转换为二进制:
11÷2=5 余 15÷2=2 余 12÷2=1 余 01÷2=0 余 1
余数倒序排列为1011。
-
-
二进制与八进制之间的转换
-
二进制转八进制:将二进制数从右到左每3位一组,不足3位的在左边补0,然后将每组转换为对应的八进制数字。例如,二进制101101转换为八进制:
101 101→5 5→55
-
八进制转二进制:将八进制数的每一位转换为对应的3位二进制数。例如,八进制55转换为二进制:
5→101 5→101
结果为 101101
-
-
二进制与十六进制之间的转换
-
二进制转十六进制:将二进制数从右到左每4位一组,不足4位的在左边补0,然后将每组转换为对应的十六进制数字。例如,二进制10110110转换为十六进制:
1011 0110→B 6→B6
-
十六进制转二进制:将十六进制数的每一位转换为对应的4位二进制数。例如,十六进制B6转换为二进制:
B→1011 6→0110
结果为 10110110
-
-
十进制与其他进制之间的转换
-
十进制转八进制:将十进制数不断除以8,记录每次的余数,直到商为0,然后将余数倒序排列。例如,十进制83转换为八进制:
83÷8=10 余 3
10÷8=1 余 2
1÷8=0 余 1
余数倒序排列为123。
-
十进制转十六进制:将十进制数不断除以16,记录每次的余数,直到商为0,然后将余数倒序排列。例如,十进制419转换为十六进制:
419÷16=26 余 3
26÷16=1 余 10(A)
1÷16=0 余 1
余数倒序排列为1A3。
-
-
小数部分的转换
整数部分的转换使用除基取余法,小数部分的转换使用乘基取整法
某些小数在不同进制下可能无法精确表示
如:十进制75.3中的小数部分0.3转换成二进制
0.3*2=0.6取整数部分0
0.6*2=1.2取整数部分1
0.2*2=0.4取整数部分0
0.4*2=0.8取整数部分0
0.8*2=1.6取整数部分1
以此类推
0.3二进制表示为01001……(无法精确表示只能无限接近)
四、进制的表示
1、常见的进制后缀
二进制(Binary)
后缀:通常使用b或B。
示例:1011b或1011B表示二进制数1011。
八进制(Octal)
后缀:通常使用o或O。
示例:123o或123O表示八进制数123。
十进制(Decimal)
后缀:十进制数通常不需要后缀,因为它是默认的进制。
示例:123或123d或123D表示十进制数123。
十六进制(Hexadecimal)
后缀:通常使用h或H。
示例:1A3h或1A3H表示十六进制数1A3。
2.编程语言
不同的编程语言对进制后缀的支持有所不同
- C/C++
在C/C++中,通常使用前缀而不是后缀来表示不同进制的数字:
二进制:不直接支持二进制字面量(C++20及以上版本支持0b前缀)。
八进制:以0开头表示八进制。例如,0123表示八进制123。
十六进制:以0x或0X开头表示十六进制。例如,0x1A3表示十六进制1A3。 - Python
Python中也使用前缀来表示不同进制的数字:
二进制:以0b或0B开头。例如,0b1011表示二进制1011。
八进制:以0o或0O开头。例如,0o123表示八进制123。
十六进制:以0x或0X开头。例如,0x1A3表示十六进制1A3。 - Assembly(汇编语言)
在汇编语言中,后缀的使用更为常见,具体取决于具体的汇编器和指令集:
二进制:b或B。例如,1011b。
八进制:o或O。例如,123o。
十六进制:h或H。例如,1A3h。
五、进制在计算机中的应用
- 二进制
计算机硬件使用二进制来表示数据和指令,因为电子元件只有两种状态(0和1),这与二进制的特性完全匹配。 - 八进制
- 早期计算机系统:在早期的计算机系统中,八进制被广泛使用。这是因为早期计算机的字长(如12位、16位、24位等)通常是3的倍数,八进制可以很好地表示这些字长的数据。例如,一个12位的二进制数可以分为4组,每组3位,每组可以用一个八进制数字表示。
- 权限表示:在Unix和类Unix系统中,文件权限常常用八进制表示。例如,权限
755
表示所有者有读、写、执行权限(7),组用户有读和执行权限(5),其他用户也有读和执行权限(5)。
- 十六进制
- 现代计算机系统:十六进制在现代计算机系统中被广泛使用,因为现代计算机的字长通常是4的倍数(如16位、32位、64位等)。十六进制可以更简洁地表示较长的二进制数。例如,一个32位的二进制数可以用8个十六进制数字表示。
- 内存地址表示:在调试程序或查看内存地址时,十六进制常用于表示内存地址。例如,内存地址
0x12345678
是一个32位地址的十六进制表示。 - 颜色编码:在网页设计和图形编程中,十六进制常用于表示颜色。例如,
#FF0000
表示红色,#00FF00
表示绿色,#0000FF
表示蓝色。
六、真值和机器数
真值:实际带正负的数
机器数:把正负号转换后的数字
#计算机组成原理-笔记-003