引言
在做数据读写传输时最常用也最直观的莫过于十进制数,但是在不同应用场合、存储的方便在C语言开发时候也常采用二进制、八进制和十六进制存储数据。这边博文将对这3种进制转十进制及十进制转这3种进制做一解释并举例。
什么是进制
进制是一种计数机制,对于任何一种进制,如:x进制,就表示某一位置上的数运算时逢 x 进一位。例如:时间60′,分钟就会加 1,这就是六十进制。计算机中常用的进制有二进制、八进制、十进制、十六进制。下面将分别举例介绍这些进制及转换十进制的方法和十进制分别这几种进制的方式。
位值计数法
位值制记数法,一种利用位值制记数的方法。位值制即每个数码所表示的数值,不仅取决于这个数码本身,而且取决于它在记数中所处的位置。
x进制整数an−1⋯a3a2a1a0转换十进制整数过程:
x进制采用位置计数法,位权是x为底的幂。对于n位整数,x进制数用加权系数的形式表示如下:
a0×x0+a1×x1+a2×x2+a3×x3+⋯+an−1×xn−1
十进制的整数
a0
转换
x
进制的整数过程:
为了叙述方便,
x
进制的数据从左到右,分别记作第一位,第二位
⋯
,int为取整。
第一位:
a0%x
a1=int(a0/x)
第二位:
a1%x
a2=int(a1/x)
第三位:
a2%x
⋯
下面不同进制之间的转换将按照位值计数法进行转换。
二进制
二进制是一种“逢二进一”的进制制,它用 0 和 1 两个符号来描述。在自然界中大多数事物都存在可用0和1表示的相对立的二个状态。在计算机中正是利用了这一特点,采用电位的高低、脉冲的有无、二极管的截止与导通、纸带上有孔无孔等来表示0、1这两个状态。
二进制转十进制:
二进制数字:10101011
十进制数字:
1×20+1×21+0×22+1×23+0×24+1×25+0×26+1×27=1+2+0+8+0+32+0+128=171
十进制转二进制:
十进制数字:171
二进制数字:
第一位:171%2=1
int(171/2)=85
第二位:85%2=1
int(85/2)=42
第三位:42%2=0
int(42/2)=21
⋯
最后计算得二进制数字:10101011
用二进制表示一个数所使用的位数要比十进制、八进制、十六进制等表示时使用的位数长得多,书写起来不方便,也不好读,这是二进制的缺陷。为此,人们通常使用八进制、十六进制来作为二进制的缩写方式。
八进制
八进制,Octal,缩写OCT或O,一种以8为基数的计数法,采用0,1,2,3,4,5,6,7八个数字,逢八进1。一些编程语言中常常以数字0开始表明该数字是八进制。
八进制转十进制:
八进制数字:127
十进制数字:
7×80+2×81+1×82=7+16+64=87
十进制转八进制:
十进制数字:87
八进制数字:
第一位:87%8=7
int(87/8)=10
第二位:10%8=2
int(10/8)=1
第三位:1%8=1
因此得十进制数:127
十六进制
十六进制,Hexadecimal,它由0-9,A-F组成,字母不区分大小写。与10进制的对应关系是:0-9对应0-9;A-F对应10-15。
十六进制转十进制
十六进制数字:0x7fff
十进制数字:
15×160+15×161+15×162+7×163=15+240+3840+28672=32767
十进制转十六进制
十进制数字:32767
十六进制数字:
第一位:32767%16=f
32767/16=2047
第二位:2047%16=f
⋯
计算得16进制数字:7fff
提示C++源码中定义随机数最大值为十六进制的7fff:
/* Maximum value that can be returned by the rand function. */
#define RAND_MAX 0x7fff
总结
这里只涉及了正整数的多种进制的互相转换,后面会不断完善小数及负数的多种进制的互相转换。
参考