C语言的进制转换

今天来给大家分享一篇好文章,这也是C语言的一大难点,希望大家能喜欢。
学习编程,尤其是底层编程,免不了要接触到各种进制数(二进制/十进制/十六进制),以及它们之间的相互转换。
在这里插入图片描述
不难发现,它们之间是有规律可循的。

比如 11(2)== 2^2 - 1(10);111(2)== 2^3 - 1(10);1111(2)== 2^4 - 1(10);1111 1111(2)== 2^8 - 1(10)

又比如 1111(2)== F(16),1111 1111(2)== FF(16)

注1:小括号中的数字表示进制数,即(2)是二进制的意思。

注2:脱字符()表示幂(次方)的意思,32 即 3 的 2 次幂(方)。

知道这上边两条规律,对你平时开发调试程序是很有帮助的。

比如你看到二进制数 111111,立刻就知道对应的十进制数是 2^6-1,即 2 * 2 * 2 * 2 * 2 * 2 - 1 == 63

比如你知道为何调试程序的时候调试器总会将内存中的二进制数转换为十六进制 —— 因为恰好 8 位二进制数(一个字节)用 2 位十六进制数即可表示,非常节约空间。
在这里插入图片描述
上图是十六进制,下图是二进制:
在这里插入图片描述

二进制数和十进制数之间的相互转换

二进制 -> 十进制
从二进制数转换到十进制数,我们使用“按权相加”的方法。

什么是“权”?

所谓“权”,即“位权”!

比如说一个八位的二进制数 0010 1010,从右往左(←),每个位的“位权”依次是 01234567,如下图所示:

在这里插入图片描述

下边是公式:

十进制数 == 依次将每个二进制位的值 * 2的位权次方再相加
说人话就是,上边的二进制数 0010 1010 转换成十进制数就是:

  0 * 2^7 + 0 * 2^6 + 1 * 2^5 + 0 * 2^4 + 1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 0 * 2^0

== 0 * 128 + 0 * 64 + 1 * 32 + 0 * 16 + 1 * 8 + 0 * 4 + 1 * 2 + 0 * 1

== 42

好,再举个例子,将二进制数 0100 1101 转换成十进制数就是:

  0 * 2^7 + 1 * 2^6 + 0 * 2^5 + 0 * 2^4 + 1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1 * 2^0

== 0 * 128 + 1 * 64 + 0 * 32 + 0 * 16 + 1 * 8 + 1 * 4 + 0 * 2 + 1 * 1

== 77
温馨提示:“按权相加”的方法适用于任何进制数到十进制数的转换。
二进制(补码)-> 十进制
上边的转换是对于无符号数来说的,如果万一摊上一有符号数,那转换就不是这么简单了……

当然,也不是那么复杂!
对于有符号数(补码)来说:

如果符号位为 0,表示该数为正数,转换跟无符号数没什么两样。

如果符号位为 1,表示该数为负数,此时符号位的位权不变,但该位的权值应该乘以 -1 得到。

举个栗子,将有符号数 0011 1100 转换成十进制数,与无符号数的做法是一样的:

  0 * 2^7 + 0 * 2^6 + 1 * 2^5 + 1 * 2^4 + 1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 0 * 2^0

== 32 + 16 + 8 + 4

== 60

然后如果符号位为 1,表示这是一个负数,比如 1011 1100,那么符号位的权值就应该乘以 -1 得到:

  -1 * 2^7 + 0 * 2^6 + 1 * 2^5 + 1 * 2^4 + 1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 0 * 2^0

== -128 + 32 + 16 + 8 + 4

== -68

在举个极端点的例子,比如 1000 0000:

  -1 * 2^7 + 0 * 2^6 + 0 * 2^5 + 0 * 2^4 + 0 * 2^3 + 0 * 2^2 + 0 * 2^1 + 0 * 2^0

== -128

现在明白为啥 1000 0000 表示 -128 了吧~
十进制 -> 二进制
从十进制数转换到二进制数,我们使用“辗转相除”的方法。不过我们这里不是要求最大公约数,而是取其余数。

即将待转换的十进制数不断地除以 2,直到商为 0,将每次除得的余数倒序拼凑起来,便是对应的二进制数……

好吧,No pic you say a J8:
在这里插入图片描述
尼玛上边这图我画了半个小时,强迫症害死人……
二进制数和十六进制数之间的相互转换
鉴于二进制和十六进制之间有着密不可分的暧昧关系,你只需要记住下边这个表格即可:

在这里插入图片描述
一旦遇到很多二进制数,你就从右往左,每四个为一组,查上表(其实用不了多久你就能记住它们间的对应关系了@_@)

一旦遇到十六进制数,你心里也有底了,不过就是把每个十六进制数拆解成 4 位二进制数嘛。
这还是需要计算呐,有木有更好的方法,我也想知道。

感悟
这篇文章还不错吧?有没有人和我一样懵逼呢?这太复杂了,确又是C语言的一大难点,一起加油吧。

好了,祝大家学习愉快,趁青春,上代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值