美文网首页
C语言教程(003)-进制

C语言教程(003)-进制

作者: 爱学习的老周 | 来源:发表于2019-08-01 21:24 被阅读0次

    进制

    1、常用进制

    十进制

    002.GIF

    从小学开始我们就学习了数数,我们对0~9这十个数字很熟悉。我们管小数点前的第一位叫做个位,每个1代表1,第二位叫做十分位,每个1代表10,第三位叫做百分位,每个1代表100,以此类推,无穷无尽。

    我们计一个大于9的整数,就要用到十分位,因为一个位只能容纳从0~9这十个数字,多出来的就需要向高位进1,这种计数方式就是十进制。

    我们说的个位,十分位,百分位就是,在一个位上,每个1代表的数字大小,就是位权,简称。如果一个数的计数方式是n进制,我们就称n是这个数的。这个数的大小也就是
    N=\sum_{i=1}^{k}D_{i}n(i-1)+\sum_{j=1}^{g}D_{j}n(-j)
    其中k是整数部分的总位数,g是小数部分的总位数,D是每一确定位上的值。

    拿十进制为例,比如一个数字520.1214
    520.1314=0\times 10^{0} + 2 \times 10^{1}+5\times 10^{2}+1\times 10^{-1}+3\times 10^{-2}+1\times 10^{-3}+4\times 10^{-4}
    二进制

    在计算机内部,数据都是以二进制的形式存储的,二进制是学习编程必须掌握的基础。

    用理解十进制的方法,我们可以理解任意进制。

    二进制,就是一种只用0和1计数方式,当前位满2就向高位进1,同样,做减法时当前位如果不够减了,就需要向高位借1,高位的1相当于相邻低位的2。

    003.png

    八进制

    八进制用0-7八个数字计数,基数是8,逢8进位,同样,做减法时当前位不够减时,向高位借1,高位的1相当于相邻低位的8。

    例如:

    004.png

    十六进制

    十六进制中,用A来表示10,B表示11,C表示12,D表示13,E表示14,F表示15,因此有 0~F 共16个数字,基数为16,加法运算时逢16进1,减法运算时借1当16。例如,数字 0、1、6、9、A、D、F、419、EA32、80A3、BC00 都是有效的十六进制。

    需要注意的是,十六进制不区分大小写,也就是说,BC00和bc00是同一个数字。

    005.png

    2、进制相互转换

    1、其它进制转十进制

    按照最开始展示的公式,将其它进制转换成十进制很容易。

    例如:

    • 二进制:1001 = 1×23 + 0×22 + 0×21 + 1×20 = 8 + 0 + 0 + 1 = 9(十进制)

    • 二进制:101.1001 = 1×22 + 0×21 + 1×20 + 1×2-1 + 0×2-2 + 0×2-3 + 1×2-4 = 4 + 0 + 1 + 0.5 + 0 + 0 + 0.0625 = 5.5625(十进制)

    • 八进制:302 = 3×82 + 0×81 + 2×80 = 192 + 0 + 2 = 194(十进制)

    • 八进制:302.46 = 3×82 + 0×81 + 2×80 + 4×8-1 + 6×8-2 = 192 + 0 + 2 + 0.5 + 0.09375= 194.59375(十进制)

    • 十六进制:EA7 = 14×162 + 10×161 + 7×160 = 3751(十进制)

    2、十进制转其它进制

    整数部分

    十进制整数转换为 N 进制整数采用“除 N 取余,逆序排列”法。具体做法是:

    • 将 N 作为除数,用十进制整数除以 N,可以得到一个商和余数;

    • 保留余数,用商继续除以 N,又得到一个新的商和余数;

    • 仍然保留余数,用商继续除以 N,还会得到一个新的商和余数;

    • ……

    • 如此反复进行,每次都保留余数,用商接着除以 N,直到商为 0 时为止。

    把先得到的余数作为 N 进制数的低位数字,后得到的余数作为 N 进制数的高位数字,依次排列起来,就得到了 N 进制数字。

    小数部分

    十进制小数转换成 N 进制小数采用“乘 N 取整,顺序排列

    • 用 N 乘以十进制小数,可以得到一个积,这个积包含了整数部分和小数部分;

    • 将积的整数部分取出,再用 N 乘以余下的小数部分,又得到一个新的积;

    • 再将积的整数部分取出,继续用 N 乘以余下的小数部分;

    • ……

    • 如此反复进行,每次都取出整数部分,用 N 接着乘以小数部分,直到积中的小数部分为 0,或者达到所要求的精度为止。

    把取出的整数部分按顺序排列起来,先取出的整数作为 N 进制小数的高位数字,后取出的整数作为低位数字,这样就得到了 N 进制小数。

    例如:

    我们想将一个十进制数字36926转换成八进制,我们将这个数除以8,得商4615余6,这个6就是八进制小数点前的第一位。我们继续将4615除以8,得商576余数7,这个7就是小数点前第二位。以此类推。576继续除以8,得商72余数0,72继续除以8,得商9余数0,9继续除以8,得商1余数1,1继续除以8,得商0余数1.

    如此一来,就得到了这个数的八进制表示方式110076。

    如果我们想将一个十进制小数0.930908203125转换成八进制,首先将这个数乘8,得到一个数字7.447265625,我们将整数7取出来,它就是八进制的小数点后第一位,将去掉整数7之后的小数0.447265625继续乘8,得到3.578125,整数3是小数点后第二位,继续将小数部分乘8,得4.625,将0.625乘8,得到5,至此小数部分全部乘尽。

    如此一来,就得到了这个数得八进制表示方式0.7435

    3、为什么这样会是正确的?

    为什么这样就能转换呢?基于什么原理呢?我们接下来用一些数学方法来证明它。

    【我们把整数和小数分开算,因为其转换规则不同,证明的时候我们也分开证明,如果一个数字既有整数部分,又有小数部分,就将其分开换算,再加一起就可以了。】

    整数部分

    假设一个十进制整数a,我们将它转换成N进制计数法,假设转换完成后,它整数部分共有k位,每一位上的数值从右往左分别是 D_{1}, D_{2}, ... ,D_{k},那么这个数可以写为:
    a=D_{k}\times N^{k-1}+D_{k-1}\times N^{k-2}+ \cdots +D_{2}\times N^{1}+D_{1}\times N^{0}
    我们要做的就是求出每一位上的D_{k}。按照前面讲过的方法,将上式除N取余。得
    D_{k}\times N^{k-2}+D_{k-1}\times N^{k-3}+ \cdots +D_{2}\times N^{0}
    D_{1}去哪了呢?前面的都是可以被整除的,D_{1}就成了余数,所以这样我们看到余数的值是多少,就知道小数点前面的第一位数值D_{1}是多少了。去掉每一步的余数,再除以N。

    按照此步骤反复执行,就依次将D_{1}, D_{2}, D_{3}, \cdots , D_{k}全都求出来了。

    小数部分

    假设一个十进制小数a,我们将它转换成N进制计数法,设转换完成后共有k位小数,每一位上的数值从左往右分别是D_{1}, D_{2}, ... ,D_{k},那么这个数可以表示为:
    a=D_{1}\times N^{-1}+D_{2}\times N^{-2}+ \cdots +D_{K-1}\times N^{1-k}+D_{k}\times N^{-k}
    我们要做的就是求出每一位上的D_{k}。按照前面讲过的方法,将上式乘N取整。得
    D_{1}\times N^{0}+D_{2}\times N^{-1}+ \cdots +D_{K-1}\times N^{2-k}+D_{k}\times N^{1-k}
    可以看到,整数部分就是D_{1},我们将整数取出,继续乘N,反复执行,就依次将D_{1}, D_{2}, D_{3}, \cdots , D_{k}全都求出来了。

    注意,十进制小数转换成其他进制小数时,结果有可能是一个无限位的小数。例如0.51等。
    4、二进制、八进制和十六进制的转换方法

    以上换算方法适用于所有进制之间的换算,但是这样很麻烦,有时候用更简单的方法。

    每三位二进制数字可以转换为一位八进制数字,每四位二进制数字可以转换为一位十六进制数字,所以我们常用一下方法进行转换。

    比如我们将一个二进制数字10111100011转换成八进制1343:

    006.png

    注意,换算时必须始终保持小数点对齐,整数部分不足时在高位补零,当有小数时,小数部分不足时往低位补零。

    例如:

    二进制数字1011.0111换算成八进制数13.74:

    007.png

    十六进制与二进制之间的换算道理是一样的,唯一的区别是十六进制的每一位对应二进制的四个位。

    关注微信公众号 axxd_lz后台回复【C语言】领取视频和电子书

    相关文章

      网友评论

          本文标题:C语言教程(003)-进制

          本文链接:https://www.haomeiwen.com/subject/ickhdctx.html