常见进制类型

我们日常生活中用的大多是10进制很少见到二进制,八进制,十六进制。而在编程中却比较常常听说,但有时还是以10进制为主,我们说机器识别二进制,但是二进制是不能直接从我们的编译器直接输出的。我们的2进制8进制和16进制实际上只是规定满多少进位的标准,2进制为满二进1,8进制满8进1,16进制满16进1,有必要补充一下的是由于阿拉伯数字只有10个即0-9所以在16进制中10-15分别用a-f代替(大小写均可)。


进制应用

在vs2022(只是本人使用的为vs2022,如果有其他编译器小伙伴也可以自行尝试)中我们可以输入一个十进制数如25,让其转化为8进制和16进制的数,如代码:

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main(){
int a=46;
printf("转化为16进制小写为%x\n",a);
printf("转化为16进制大写为%X\n",a);
printf("转化为8进制为%o\n",a);//注意,此处为字母o不是数字0.(小写)
system("pause");
return 0;
}

输出结果应该为

image-20231028144532074

那么我们可不可以将直接输入其他进制转化为10进制呢?肯定是可以的。我们可以直接将数值以8进制和16进制,其中8进制赋值必须以0开头,而16进制必须以0x开头,输出时必须也要是整形输出即%d,如下代码:

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main(){
int a=0251;//以8进制赋值。
int b=0xadc;//以16进制赋值。
printf("10进制a的值为%d\n",a);
printf("10进制b的值为%d\n",b);
system("pause");
return 0;
}

以下为输出结果:

image-20231028144229714

这时候就要注意了,在c语言中时不能直接输入和输出2进制转化的。编译器不能直接转化2进制。赋值时不要直接写2进制!!!赋值时不要直接写2进制!!!赋值时不要直接写2进制!!!


进制的转化

让电脑帮我们算进制并不难,那么我们自己该如何去实现进制转换呢。

首先我们来说2进制:除2反序取余法。

我们来探究一下46转化成2进制时怎样的。如下图:

image-20231028144256043

最左侧为除数,因为是2进制所以除的是2 ,46/2余数为0,23余数为1依次递推,到最后剩下1或0时结束,并把1或0直接放到余数位。如我的最后剩1直接到余数位,此时得到的2进制是由余数倒序排列而成,我们可以来验算一下,这里我用微软的程序员计算器验算,如图:

image-20231028144309143

介绍一下,hex是转化为16进制显示,dec即为10进制,oct为8进制,bin为2进制显示,这里结果与我们计算结果相同,只是它默认8位前面的用0补全空位了。

而我们的8进制和16进制也是同理,用除8反序取余和除16反序取余就可以了。可以看看下面的表格,如表:

10进制 2进制 8进制 16进制
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
11 1011 13 B
12 1100 14 C
13 1101 15 D
14 1110 16 E
15 1111 17 F
16 1 0000 20 10

可以很直观看出4者的进制差距,并且我们可以观察到他们的共同处:2进制进第4位,8进制进一位;8进制进2位,16进制进1位。这是由于他们的进位成倍数关系导致,这个规律可以邮箱提高进制之间转化而不必每次都要转化为10进制再转化为其他进制。


资料参考

b站的黑马程序员