常见进制(二、八、十、十六进制)
一、进制的分类
十进制(decimal)
:
- 数字组成:0-9
- 进位规则:满十进一
- C 语言的整数默认都是十进制数
二进制(binary)
:
- 数字组成:0-1
- 进位规则:满二进一,以
0b
或0B
开头int x = 0b10; // 十进制的数字2赋值给变量x
八进制(octal)
:
- 数字组成:0-7
- 进位规则:满八进一,以数字
0
开头表示int x = 010; // 十进制的数字8赋值给变量x
十六进制
:
- 数字组成:0-9,a-f
- 进位规则:满十六进一,以
0x
或0X
开头表示。此处的 a-f 不区分大小写int x = 0x10; // 十进制的数字16赋值给变量x
二、常见的进制换算
十进制 | 二进制 | 八进制 | 十六进制 |
---|---|---|---|
0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 |
2 | 10 | 2 | 2 |
3 | 11 | 3 | 3 |
4 | 100 | 4 | 4 |
5 | 101 | 5 | 5 |
6 | 110 | 6 | 6 |
7 | 111 | 7 | 7 |
8 | 1000 | 10 | 8 |
9 | 1001 | 11 | 9 |
10 | 1010 | 12 | a或A |
11 | 1011 | 13 | b或B |
12 | 1100 | 14 | c或C |
13 | 1101 | 15 | d或D |
14 | 1110 | 16 | e或E |
15 | 1111 | 17 | f或F |
16 | 10000 | 20 | 10 |
三、输出格式控制
1.不同的进制只是整数的书写方法不同,不会对整数的实际存储方式产生影响。
2.不同进制可以混合使用,比如 10 + 015 + 0x20 是一个合法的表达式。
例如:
int x = 100;
printf("dec = %d\n", x); // 100
printf("octal = %o\n", x); // 144
printf("hex = %x\n", x); // 64
printf("octal = %#o\n", x); // 0144
printf("hex = %#x\n", x); // 0x64
printf("hex = %#X\n", x); // 0X64
四、进制间的转换
计算机数据的存储使用二进制
补码
形式存储,并且最高位是符号位
。(0正1负)
1.原码、反码和补码
Ⅰ.正数
正数的补码与反码、原码一样,称为
三码合一
Ⅱ.负数
原码
:把十进制转为二进制,最高位置为1
反码
:原码的符号位不变,其余位取反(0变1,1变0)
补码
:反码+1即为补码
个人认为好像原码、反码和补码都是针对二进制而言的。
至于如何计算原码、反码和补码在下面会讲解
2.二进制与十进制的转换
Ⅰ.二进制转十进制:权相加法
从右至左,每一位依次乘以 2 0 2^0 20、 2 1 2^1 21、 2 2 2^2 22、 2 3 2^3 23 ……
例如:二进制1101
对应的十进制为 1* 2 0 2^0 20 + 0* 2 1 2^1 21 + 1* 2 2 2^2 22 + 1* 2 3 2^3 23 = 13
Ⅱ.十进制转二进制:除2取余的逆
Ⅲ、求原码、反码和补码
这里我们以两个字节(即16位)为例,计算正负二十七的原码、反码和补码
+27的原码、反码和补码
:
-27的原码、反码和补码
:
3.二进制与八进制的转换
Ⅰ.二进制转八进制
将二进制从右至左,每够三位就转换为十进制数字,如果最后不够三位,往前补0,最终就是八进制
Ⅱ.八进制转二进制
将八进制从右至左,每够三位就转换为二进制,最终得到二进制
4.二进制与十六进制的转换
Ⅰ.二进制转十六进制
将二进制从右至左,每够四位就转换为十进制数字,如果最后不够四位,往前补0,最终就是十六进制
Ⅱ.十六进制转二进制
将十六进制从右至左,每够四位就转换为二进制,最终得到二进制