一、前言
本文作者是从 2007 年开始学 C语言 的,不久又接触了C++,基本就是 C/C++ 技术栈写了 14 年的样子,不算精通,但也算差强人意。著有《夜深人静写算法》系列,且承诺会持续更新,直到所有算法都学完。主要专攻 高中 OI 、大学 ACM、 职场 LeetCode 的全领域算法。由于文章中采用 C/C++ 的语法,于是就有不少读者朋友反馈语言层面就被劝退了,更何况是算法。
于是,2021 年 06 月 12 日,《光天化日学C语言》 应运而生。并且作者在此承诺,这个系列全部文章均免费且开源,主要服务于高中生、大学生以及职场上想入坑C语言的志同道合之人,希望能给祖国引入更多编程方面的人才,并且让自己的青春不留遗憾!
这一章我们将介绍数学中一个比较重要的概念:进制转换。
二、人物简介
- 第一位登场的就是今后会一直教我们C语言的老师 —— 光天。
- 第二位登场的则是今后会和大家一起学习C语言的没什么资质的小白程序猿 —— 化日。
三、何为进制
- 进制也就是 进位计数制 的简称,是人为定义的带进位的计数方法。
- 对于任何一种进制 —— X进制,表示每一个数位上的数运算时都是逢 X 进一位。
- 例如:十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,八进制是逢八进一,以此类推,X进制就是 逢X进一。
- 如图三-1所示,代表的则是十进制的进位演示:
四、常用进制
1、二进制
- 我们从定义出发:逢二进一。
两只鞋子 = 1双鞋子;
二个抓手 = 1双手;
2、三进制
- 同样,什么是逢三进一呢?
3个月 = 1个季度;
3、四进制
- 好了接下来,你能举出四进制的例子吗?
4个季度 = 1年
5、十进制
- 当然,现实生活中遇到的最多的数字都是十进制表示。例如:0、1、2、3、… 、9、10、…
4、其它进制
七进制:7天 = 1周;
十二进制:12瓶啤酒 = 1打;
二十四进制:24小时 = 1天;
六十进制:60秒 = 1分钟;60分钟 = 1小时;
五、计算机中的进制
- 在计算机中常用的进制有哪些呢?
1、二进制
- C语言中,我们如果想表示一个二进制数,可以用
0b
作为前缀,然后跟上0
和1
组成的数字,我们来看一段代码:
#include <stdio.h>
int main() {
int a = 0b101;
printf("%d\n", a);
return 0;
}
- 这段代码中,输出的结果如下:
5
- 因为
%d
代表输出的数是十进制,所以我们需要将二进制转换成十进制以后输出,0b101
的数学表示如下:$$(101)_2$$ - 它在十进制下的值为 5。
- 因为数字比较小,所以我们可以简单列出二进制和十进制的对应关系如下:
进制 | 零 | 一 | 二 | 三 | 四 | 五 |
---|---|---|---|---|---|---|
二进制 | 0 | 1 | 10 | 11 | 100 | 101 |
十进制 | 0 | 1 | 2 | 3 | 4 | 5 |
- 也就是二进制下
101
对应于十进制下的 5。
2、八进制
- 讲八进制之前,我们还是先来看一段代码:
#include <stdio.h>
int main() {
int a = 0123;
printf("%d\n", a);
return 0;
}
- 那么,这段代码的输出值为多少呢?
83
- 为什么呢?参考二进制的表示法,八进制的表示法是前缀1个
0
,然后跟上0-7
的数字; - 换言之,我们需要把
123
这个八进制数转换成十进制后再输出。而转换结果就是83
,由于这里数字较大,我们已经无法一个一个数出来了,所以需要进行进制转换,关于进制转换,在第四节进制转换初步里再来讲解。
3、十六进制
- 同样的,对于十六进制数,表示方式为:以
0x
或者0X
作为前缀,跟上0-9
、a-f
、A-F
的数字,其中大小写字母的含义相同,分别代表从10
到15
的数字。如下表所示:
小写字母 | 大写字母 | 代表数字 |
---|---|---|
a |
A |
10 |
b |
B |
11 |
c |
C |
12 |
d |
D |
13 |
e |
E |
14 |
f |
F |
15 |
- 我们看看这段代码的输出:
#include <stdio.h>
int main() {
int a = 0X123;
printf("%d\n", a);
return 0;
}
- 对于这段代码,输出的是:
291
六、进制转换初步
1、X进制 转 十进制
对于 X 进制的数来说,我们定义以下几个概念:
【概念1】对于数字部分从右往左编号为 0 到 ,第 个数字位表示为 ,这个数字就是 ;
【概念2】每个数字位有一个权值;
【概念3】第 个数字位的权值为 ;
- 基于以上几个概念, X进制 转 十进制的值为 每一位数字 和 它的权值的乘积的累加和,如下:
-
- 是个求和符号,不必惊慌!
- 举个例子,对于上文提到的八进制的数
0123
,转换成十进制,只需要套用公式: -
- 再如,上文提到的十六进制数
0X123
,转换成十进制,套用同样的公式,如下: -
2、十进制 转 X进制
- 对于 十进制 转 X进制 的问题,我们可以这么来考虑:
- 从 X进制 转 十进制 的原理可知,任何一个十进制数字都是由 X进制 的幂的倍数累加而成。所以,一个数一定有 这部分,而这部分,可以通过原数除上 的余数得到。然后我们把原数除上 后得到的数,肯定又有 的部分,就这样重复的试除,直到得到的商为 零 时结束,过程中的余数,逆序一下就是对应进制的数了。
- 还是一上文的例子来说,对于
291
我们可以通过如下方式,转换成 十六进制。
291 除 16 ========== 余 3
18 除 16 =========== 余 2
1 除 16 ============ 余 1
- 而对于十进制的83,我们可以通过如下方式,转换成 八进制。
83 除 8 ============ 余 3
10 除 8 ============ 余 2
1 除 8 ============= 余 1
- 那么,等我们后面学习了循环语句以后,就可以教大家如何用计算机来实现进制转换了,目前阶段只需要了解下进制转换的基本原理即可。
通过这一章,我们学会了:
1)二进制的表示方式为:0b
作为前缀,加上0-1
组成的数字;
2)八进制的表示方式为:0
作为前缀,加上0-7
组成的数字;
3)十六进制的表示方式为:0x
或者0X
作为前缀,加上0-9
、a-f
,A-F
组成的数字;
4)X进制转换成十进制;
5)十进制转换成X进制;
- 希望对你有帮助哦 ~ 祝大家早日成为 C 语言大神!