C语言之进制转换
- 一、引言
- 二、十进制与二进制、八进制、十六进制
- 三、二进制与八进制、十六进制
- 四、八进制与十六进制
一、引言
在C语言中,经常使用的整数的进制有十进制、二进制、十六进制(在C语言中以0x或0X为前缀)、八进制(在C语言中以0为前缀),计算机内部使用的是二进制进行编码和存储,而其他三种进制可供程序员选择,在讲述它们之间的转换规则之前,先介绍一下这几种进制的基本概念是有必要的
- 什么是进制?进位计数制,人为定义的一种计数方法,使用进位计数法,可以用有限的数字符号代表所有的数值,可使用数字符号的数目称为基数(radix)或底数,基数为n,即可称n进位制,简称n进制。
- 什么是位权?对于多位数,处在某一位上的“1”所表示数值的大小,称为该位的位权。例如十进制第2位的位权为10,第3位的位权为100;而二进制第2位的位权为2,第3位的位权为4,对于 N进制数,整数部分第 i位(从0开始,从右往左数,0,1,2…)的位权为N^ i , 而小数部分第j位(从-1开始,从左往右数, -1,-2…)的位权为N^(-j)。数码(某一位的数字符号)所表示的数值等于该数码本身乘以它所在数位的位权。
- 十进制(dec):基数为10,逢十进一,数码由0-9的10个数字组成
- 二进制(bin):基数为2,逢二进一,数码由0和1两个数字组成
- 八进制(oct):基数为8,逢八进一,数码由0-7的8个数字组成
- 十六进制(hex):基数为16,逢十六进一,数码由0-9和A-F的16个数字和字母组成
对于任何一个数,我们可以用不同的进制来表示,下面所有的例子都以十进制数 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