在C语言中,经常使用的整数的进制有十进制、二进制、十六进制(在C语言中以0x或0X为前缀)、八进制(在C语言中以0为前缀),计算机内部使用的是二进制进行编码和存储,而其他三种进制可供程序员选择,在讲述它们之间的转换规则之前,先介绍一下这几种进制的基本概念是有必要的
对于任何一个数,我们可以用不同的进制来表示,下面所有的例子都以十进制数 57 举例,如下的程序打印出了十进制数57的不同进制的数值,可用于后续转换结果的查验
#include <stdio.h>
int main()
{
int d = 57;
char b[32];
itoa(d, b, 2); // 库函数,整数转换二进制
printf("二进制:%s\n十进制:%d\n八进制:%o\n十六进制:%x\n", b, d, d, d);
printf("带前缀显示八进制和十六进制:\n");
// %#o %#x 带前缀显示八进制和十六进制
printf("二进制:%s\n十进制:%d\n八进制:%#o\n十六进制:%#x\n", b, d, d, d);
return 0;
}
运行结果:
二进制:111001
十进制:57
八进制:71
十六进制:39
带前缀显示八进制和十六进制:
二进制:111001
十进制:57
八进制:071
十六进制:0x39
十进制转二进制、八进制、十六进制:除2取余法;除8取余法;除16取余法
二进制、八进制、十六进制转十进制:按权求和,即将所有数位的数码乘以该位的位权依次相加,比如
(111001)2 = 1*2^5 + 1*2^4 + 1*2^3 + 0*2^2 + 0*2^1 + 1*2^0 = (57)10
(71)8 = 7*8^1 + 1*8^0 = (57)10
(39)16 = 3*16^1 + 9*16^0 = (57)10
二进制与八进制、十六进制转换比较方便,因为8和16都是2的幂次方数,八进制的每一位可以用3位二进制表示,十六进制的每一位可以用4位二进制表示
(111001)2 = 111 001 = (71)8
(111001)2 = 0011 1001 = (39)16
(71)8 = 111 001 = (111001)2
(39)16 = 0011 1001 = (111001)2
// 八进制转十六进制,先将八进制转二进制,再将二进制转十六进制
(71)8 = 111 001 = (111001)2 = 0011 1001 = (39)16
// 十六进制转八进制,先将十六进制转二进制,再将二进制转八进制
(39)16 = 0011 1001 = (111001)2 = 111 001 = (71)8