光天化日学C语言(06)- 进制转换入门 | 生活中随处可见的进制,你学废了吗?

一、前言

  本文作者是从 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双鞋子;
二个抓手 = 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作为前缀,然后跟上01组成的数字,我们来看一段代码:
#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-9a-fA-F的数字,其中大小写字母的含义相同,分别代表从1015的数字。如下表所示:
小写字母 大写字母 代表数字
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 到 n n ,第 i i 个数字位表示为 d i d_i ,这个数字就是 d n . . . d 1 d 0 d_{n}...d_1d_0
  【概念2】每个数字位有一个权值;
  【概念3】第 i i 个数字位的权值为 X i X^i

  • 基于以上几个概念, X进制 转 十进制的值为 每一位数字 和 它的权值的乘积的累加和,如下:
  • i = 0 n X i d i \sum_{i=0}^{n} X^id_i

  • \sum 是个求和符号,不必惊慌!
  • 举个例子,对于上文提到的八进制的数0123,转换成十进制,只需要套用公式:
  • i = 0 n X i d i = i = 0 2 8 i d i = 8 2 × 1 + 8 1 × 2 + 8 0 × 3 = 64 + 16 + 3 = 83 \begin{aligned}\sum_{i=0}^{n} X^id_i &= \sum_{i=0}^{2} 8^id_i \\ &= 8^2 \times 1 + 8^1 \times 2 + 8^0 \times 3 \\ &= 64 + 16 + 3 \\ &= 83\end{aligned}

  • 再如,上文提到的十六进制数0X123,转换成十进制,套用同样的公式,如下:
  • i = 0 n X i d i = i = 0 2 1 6 i d i = 1 6 2 × 1 + 1 6 1 × 2 + 1 6 0 × 3 = 256 + 32 + 3 = 291 \begin{aligned}\sum_{i=0}^{n} X^id_i &= \sum_{i=0}^{2} 16^id_i \\ &= 16^2 \times 1 + 16^1 \times 2 + 16^0 \times 3 \\ &= 256 + 32 + 3 \\ &= 291\end{aligned}

2、十进制 转 X进制

  • 对于 十进制 转 X进制 的问题,我们可以这么来考虑:
  • 从 X进制 转 十进制 的原理可知,任何一个十进制数字都是由 X进制 的幂的倍数累加而成。所以,一个数一定有 X 0 X^0 这部分,而这部分,可以通过原数除上 X X 的余数得到。然后我们把原数除上 X X 后得到的数,肯定又有 X 0 X^0 的部分,就这样重复的试除,直到得到的商为 零 时结束,过程中的余数,逆序一下就是对应进制的数了。
  • 还是一上文的例子来说,对于291我们可以通过如下方式,转换成 十六进制。
29116  ==========3
1816  ===========2
116  ============1
  • 而对于十进制的83,我们可以通过如下方式,转换成 八进制。
838 ============3
108 ============2
18 =============1
  • 那么,等我们后面学习了循环语句以后,就可以教大家如何用计算机来实现进制转换了,目前阶段只需要了解下进制转换的基本原理即可。

通过这一章,我们学会了:
  1)二进制的表示方式为:0b作为前缀,加上0-1组成的数字;
  2)八进制的表示方式为:0作为前缀,加上0-7组成的数字;
  3)十六进制的表示方式为:0x或者0X作为前缀,加上0-9a-fA-F组成的数字;
  4)X进制转换成十进制;
  5)十进制转换成X进制;

  • 希望对你有帮助哦 ~ 祝大家早日成为 C 语言大神!

(完)