【www.guakaob.com--汉语四六级】
c语言进制转换篇一:c语言 各种进制转换
c语言 各种进制转换 计算机中常用的数的进制主要有:二进制、八进制、十六进制。
2进制,用两个阿拉伯数字:0、1;
8进制,用八个阿拉伯数字:0、1、2、3、4、5、6、7;
10进制,用十个阿拉伯数字:0到9;
16进制就是逢16进1,但我们只有0~9这十个数字,所以我们用A,B,C,D,E,F这五个字母来分别表示10,11,12,13,14,15。字母不区分大小写。
以下简介各种进制之间的转换方法:
一、二进制转换十进制
例:二进制 “1101100” 1101100 ←二进制数
6543210 ←排位方法
例如二进制换算十进制的算法:
1*26 + 1*25 + 0*24 + 1*23 + 1* 22 + 0*21 + 0*20
↑ ↑
说明:2代表进制,后面的数是次方(从右往左数,以0开始)
=64+32+0+8+4+0+0
=108
二、二进制换算八进制
例:二进制的“10110111011”
换八进制时,从右到左,三位一组,不够补0,即成了:
010 110 111 011
然后每组中的3个数分别对应4、2、1的状态,然后将为状态为1的相加,如:
010 = 2
110 = 4+2 = 6
111 = 4+2+1 = 7
011 = 2+1 = 3
结果为:2673
三、二进制转换十六进制
十六进制换二进制的方法也类似,只要每组4位,分别对应8、4、2、1就行了,如分解为: 0101 1011 1011
运算为:
0101 = 4+1 = 5
1011 = 8+2+1 = 11(由于10为A,所以11即B)
1011 = 8+2+1 = 11(由于10为A,所以11即B)
结果为:5BB
四、二进制数转换为十进制数
二进制数第0位的权值是2的0次方,第1位的权值是2的1次方„„
所以,设有一个二进制数:0110 0100,转换为10进制为:
计算: 0 * 20 + 0 * 21 + 1 * 22 + 0 * 23 + 0 * 24 + 1 * 25 + 1 * 26 + 0 * 27 = 100
五、八进制数转换为十进制数
八进制就是逢8进1。
八进制数采用 0~7这八数来表达一个数。
八进制数第0位的权值为8的0次方,第1位权值为8的1次方,第2位权值为8的2次方„„ 所以,设有一个八进制数:1507,转换为十进制为:
计算: 7 * 80 + 0 * 81 + 5 * 82 + 1 * 83 = 839
结果是,八进制数 1507 转换成十进制数为 839
六、十六进制转换十进制
例:2AF5换算成10进制
直接计算就是: 5 * 160 + F * 161 + A * 162 + 2 * 163 = 10997
(别忘了,在上面的计算中,A表示10,而F表示15)、
现在可以看出,所有进制换算成10进制,关键在于各自的权值不同。
假设有人问你,十进数 1234 为什么是 一千二百三十四?你尽可以给他这么一个算式:
2 * 102 + 3 * 101 + 4 * 100
十进制与二进制转换之相互算法
十进制转二进制:
用2辗转相除至结果为1
将余数和最后的1从下向上倒序写 就是结果
例如302
302/2 = 151 余0
151/2 = 75 余1
75/2 = 37 余1
37/2 = 18 余1
18/2 = 9 余0
9/2 = 4 余1
4/2 = 2 余0
2/2 = 1 余0
故二进制为100101110
二进制转十进制
从最后一位开始算,依次列为第0、1、2...位
第n位的数(0或1)乘以2的n次方
得到的结果相加就是答案
例如:01101011.转十进制:
第0位:1乘2的0次方=1
1乘2的1次方=2
0乘2的2次方=0
1乘2的3次方=8
0乘2的4次方=0
1乘2的5次方=32
1乘2的6次方=64
0乘2的7次方=0 = 1 * 103 + 1234
然后:1+2+0+8+0+32+64+0=107.
二进制01101011=十进制107.
一、二进制数转换成十进制数
由二进制数转换成十进制数的基本做法是,把二进制数首先写成加权系数展开式,然后按十进制加法规则求和。这种做法称为"按权相加"法。
二、十进制数转换为二进制数
十进制数转换为二进制数时,由于整数和小数的转换方法不同,所以先将十进制数的整数部分和小数部分分别转换后,再加以合并。
1. 十进制整数转换为二进制整数
十进制整数转换为二进制整数采用"除2取余,逆序排列"法。具体做法是:用2去除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为零时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。
2.十进制小数转换为二进制小数
十进制小数转换成二进制小数采用"乘2取整,顺序排列"法。具体做法是:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。
然后把取出的整数部分按顺序排列起来,先取的整数作为二进制小数的高位有效位,后取的整数作为低位有效位。
1.二进制与十进制的转换
(1)二进制转十进制<BR>方法:"按权展开求和"
例:
(1011.01)2 =(1×23+0×22+1×21+1×20+0×2-1+1×2-2)10
=(8+0+2+1+0+0.25)10
=(11.25)10
(2)十进制转二进制
· 十进制整数转二进制数:"除以2取余,逆序输出"
例: (89)10=(1011001)2
2 89
2 44 „„ 1
2 22 „„ 0
2 11 „„ 0
2 5 „„ 1
2 2 „„ 1
2 1 „„ 0
0 „„ 1
· 十进制小数转二进制数:"乘以2取整,顺序输出"
例:
(0.625)10= (0.101)2
0.625
X 2
1.25
X 2
0.5
X 2
1.0
2.八进制与二进制的转换
例:将八进制的37.416转换成二进制数:
37 . 4 1 6
011 111 .100 001 110
即:(37.416)8 =(11111.10000111)2
例:将二进制的10110.0011 转换成八进制:
0 1 0 1 1 0 . 0 0 1 1 0 0
2 6 . 1 4
即:(10110.011)2 =(26.14)8
3.十六进制与二进制的转换<BR>例:将十六进制数5DF.9 转换成二进制: 5 D F . 9
0101 1101 1111.1001
即:(5DF.9)16 =(10111011111.1001)2
例:将二进制数1100001.111 转换成十六进制:
0110 0001 . 1110
6 1 . E
即:(1100001.111)2 =(61.E)16
下面是通过栈的功能实现的进制转换
#include<stdio.h>
#include<malloc.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
//typedef char SElemType;
typedefintSElemType;
typedefstruct{
SElemType *base;
SElemType *top;
intstacksize;
}SqStack;
void InitStack(SqStack&S){
S.base=(SElemType *)malloc(STACK_INIT_SIZE *sizeof(SElemType)); if(!S.base) printf("存储分配失败");
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
}
int Empty(SqStack S){
if(S.top==S.base) return 1;
else return 0;
}
intGetTop(SqStackS,SElemType&e){
if(Empty(S)) return 0;
e=*(S.top-1);
return 1;
}
int Push(SqStack&S,SElemType e){
if(S.top-S.base>=S.stacksize){
S.base=(SElemType
*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType)); if(!S.base) printf("OVERFLOW");
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return 1;
}
int Pop(SqStack&S,SElemType&e){
if(Empty(S)) return 0;
e=*--S.top;
return 1;
}
void DispStack(SqStack S){
SElemType *p;
p=S.top;
if(Empty(S)) printf("空栈");
else{
while(p!=S.base){
printf("%c",*--p);
}
}
}
void Conversion(){
SqStack S;
intN,a,e;
InitStack(S);
printf("要转换为几进制?");
scanf("%d",&a);
printf("请输入待转换数");
scanf("%d",&N);
while(N){
Push(S,N%a);
c语言进制转换篇二:C语言进制转换
c语言进制转换篇三:c语言各进制转换方法
二进制,八进制,十进制,十六进制之间的转换算法
一、 十进制与二进制之间的转换
(1) 十进制转换为二进制,分为整数部分和小数部分
① 整数部分
方法:除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数读起,一直到最前面的一个余数。下面举例:
例:将十进制的168转换为二进制
得出结果 将十进制的168转换为二进制,(10101000)2
分析:第一步,将168除以2,商84,余数为0。
第二步,将商84除以2,商42余数为0。
第三步,将商42除以2,商21余数为0。
第四步,将商21除以2,商10余数为1。
第五步,将商10除以2,商5余数为0。
第六步,将商5除以2,商2余数为1。
第七步,将商2除以2,商1余数为0。
第八步,将商1除以2,商0余数为1。
第九步,读数,因为最后一位是经过多次除以2才得到的,因此它是最高位,读数字从最后的余数向前读,即10101000
(2) 小数部分
方法:乘2取整法,即将小数部分乘以2,然后取整数部分,剩下的小数部分继续乘以2,然后取整数部分,剩下的小数部分又乘以2,一直取到小数部分
为零为止。如果永远不能为零,就同十进制数的四舍五入一样,按照要求保留多少位小数时,就根据后面一位是0还是1,取舍,如果是零,舍掉,如果是1,向入一位。换句话说就是0舍1入。读数要从前面的整数读到后面的整数,下面举例:
例1:将0.125换算为二进制
得出结果:将0.125换算为二进制(0.001)2
分析:第一步,将0.125乘以2,得0.25,则整数部分为0,小数部分为0.25;
第二步, 将小数部分0.25乘以2,得0.5,则整数部分为0,小数部分为0.5;
第三步, 将小数部分0.5乘以2,得1.0,则整数部分为1,小数部分为0.0;
第四步,读数,从第一位读起,读到最后一位,即为0.001。
例2,将0.45转换为二进制(保留到小数点第四位)
大家从上面步骤可以看出,当第五次做乘法时候,得到的结果是0.4,那么小数部分继续乘以2,得0.8,0.8又乘以2的,到1.6这样一直乘下去,最后不可能得到小数部分为零,因此,这个时候只好学习十进制的方法进行四舍五入了,但是二进制只有0和1两个,于是就出现0舍1入。这个也是计算机在转换中会产生误差,但是由于保留位数很多,精度很高,所以可以忽略不计。
那么,我们可以得出结果将0.45转换为二进制约等于0.0111
上面介绍的方法是十进制转换为为二进制的方法,需要大家注意的是:
1) 十进制转换为二进制,需要分成整数和小数两个部分分别转换
2) 当转换整数时,用的除2取余法,而转换小数时候,用的是乘2取整法
3) 注意他们的读数方向
因此,我们从上面的方法,我们可以得出十进制数168.125转换为二进制为10101000.001,或者十进制数转换为二进制数约等于10101000.0111。
(3) 二进制转换为十进制 不分整数和小数部分
方法:按权相加法,即将二进制每位上的数乘以权,然后相加之和即是十进制数。例 将二进制数101.101转换为十进制数。
得出结果:(101.101)2=(5.625)10
大家在做二进制转换成十进制需要注意的是
1) 要知道二进制每位的权值
2) 要能求出每位的值
二、 二进制与八进制之间的转换
首先,我们需要了解一个数学关系,即23=8,24=16,而八进制和十六进制是用这
关系衍生而来的,即用三位二进制表示一位八进制,用四位二进制表示一位十六进制数。 接着,记住4个数字8、4、2、1(23=8、22=4、21=2、20=1)。现在我们来练习二进制与八进制之间的转换。
(1) 二进制转换为八进制
方法:取三合一法,即从二进制的小数点为分界点,向左(向右)每三位取成一位,接着将这三位二进制按权相加,得到的数就是一位八位二进制数,然后,按顺序进行排列,小数点的位置不变,得到的数字就是我们所求的八进制数。如果向左(向右)取三位后,取到最高(最低)位时候,如果无法凑足三位,可以在小数点最左边(最右边),即整数的最高位(最低位)添0,凑足三位。例
①将二进制数101110.101转换为八进制
得到结果:将101110.101转换为八进制为56.5
② 将二进制数1101.1转换为八进制
得到结果:将1101.1转换为八进制为15.4
(2) 将八进制转换为二进制
方法:取一分三法,即将一位八进制数分解成三位二进制数,用三位二进制按权相加去凑这位八进制数,小数点位置照旧。例:
① 将八进制数67.54转换为二进制
因此,将八进制数67.54转换为二进制数为110111.101100,即110111.1011
大家从上面这道题可以看出,计算八进制转换为二进制
首先,将八进制按照从左到右,每位展开为三位,小数点位置不变
然后,按每位展开为22,21,20(即4、2、1)三位去做凑数,即a×22+ b×21 +c×20=该位上的数(a=1或者a=0,b=1或者b=0,c=1或者c=0),将abc排列就是该位的二进制数 接着,将每位上转换成二进制数按顺序排列
最后,就得到了八进制转换成二进制的数字。
以上的方法就是二进制与八进制的互换,大家在做题的时候需要注意的是
1) 他们之间的互换是以一位与三位转换,这个有别于二进制与十进制转换
2) 大家在做添0和去0的时候要注意,是在小数点最左边或者小数点的最右边(即整数的最高位和小数的最低位)才能添0或者去0,否则将产生错误
三、 二进制与十六进制的转换
方法:与二进制与八进制转换相似,只不过是一位(十六)与四位(二进制)的转换,下面具体讲解
(1) 二进制转换为十六进制
方法:取四合一法,即从二进制的小数点为分界点,向左(向右)每四位取成一位,接着将这四位二进制按权相加,得到的数就是一位十六位二进制数,然后,按顺序进行排列,小数点的位置不变,得到的数字就是我们所求的十六进制数。如果向左(向右)取四位后,取到最高(最低)位时候,如果无法凑足四位,可以在小数点最左边(最右边),即整数的最高位(最低位)添0,凑足四位。
①例:将二进制11101001.1011转换为十六进制
得到结果:将二进制11101001.1011转换为十六进制为E9.B
② 例:将101011.101转换为十六进制
因此得到结果:将二进制101011.101转换为十六进制为2B.A
(2)将十六进制转换为二进制
方法:取一分四法,即将一位十六进制数分解成四位二进制数,用四位二进制按权相加去凑这位十六进制数,小数点位置照旧。
①将十六进制6E.2转换为二进制数
因此得到结果:将十六进制6E.2转换为二进制为01101110.0010即110110.001
四、八进制与十六进制的转换
方法:一般不能互相直接转换,一般是将八进制(或十六进制)转换为二进制,然后再将二进制转换为十六进制(或八进制),小数点位置不变。那么相应的转换请参照上面二进制与八进制的转换和二进制与十六进制的转
五、八进制与十进制的转换
(1)八进制转换为十进制
方法:按权相加法,即将八进制每位上的数乘以位权,然后相加之和即是十进制数。 例:①将八进制数67.35转换为十进制
(2)十进制转换为八进制
十进制转换成八进制有两种方法:
1)间接法:先将十进制转换成二进制,然后将二进制又转换成八进制
2)直接法:前面我们讲过,八进制是由二进制衍生而来的,因此我们可以采用与十进制转换为二进制相类似的方法,还是整数部分的转换和小数部分的转换,下面来具体讲解一下: ①整数部分
方法:除8取余法,即每次将整数部分除以8,余数为该位权上的数,而商继续除以8,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数起,一直到最前面的一个余数。
②小数部分
方法:乘8取整法,即将小数部分乘以8,然后取整数部分,剩下的小数部分继续乘以8,然后取整数部分,剩下的小数部分又乘以8,一直取到小数部分为零为止。如果永远不能为零,就同十进制数的四舍五入一样,暂取个名字叫3舍4入。
例:将十进制数796.703125转换为八进制数
解:先将这个数字分为整数部分796和小数部分0.703125
整数部分
小数部分
因此,得到结果十进制796.703125转换八进制为1434.55
上面的方法大家可以验证一下,你可以先将十进制转换,然后在转换为八进制,这样看得到的结果是否一样
六、十六进制与十进制的转换
十六进制与八进制有很多相似之处,大家可以参照上面八进制与十进制的转换自己试试这两个进制之间的转换。
c语言进制转换篇四:进制转换C语言的实现
索引 一、算法分析
二、数据结构:
1、 头文件
2、 栈的关键操作
三、关键程序:
1、十进制进制转换为其它
2、其它进制转换为十进制
一、算法分析
实现进制转换需要编个函数,每一函数完成相应进制的转换,下面是各个进制之间转换的数学方法的算法。 十进制转二进制:
十进制数转换成二进制数,是一个连续除2的过程;把要转换的数,除以2,得到商和余数,将商继续除以2,直到商为0.最后将所有余数倒序排列,得到数就是转换结果。
例如:
302/2 = 151 余0
151/2 = 75 余1
75/2 = 37 余1
37/2 = 18 余1
18/2 = 9 余0
9/2 = 4 余1
4/2 = 2 余0
2/2 = 1 余0
所以302转换为2进制,结果:100101110
十进制转八进制:
十进制数转换成八进制的方法和转换为二进制的方法类似,唯一变化:除数由2变成8。
例如:
120/8=15余0
15/8=1余7
1/8=0余1
所以120转换为8进制,结果为:170
十进制转十六进制:
十进制数转换成十六进制数的方法和转换为二进制的方法类似,唯一变化:除数由2变成16。
不过,十六进制数:(10~15)是用英文大写字母(A~F)表示。 例如:
123/16=7余11
所以123转换为16进制,结果为:7B
二进制转十进制:
二进制数转换为十进制数按权展开,第0位的权值是2的0次方,第1位的权值是2的1次方〃〃〃〃〃〃
例如:
1010转换成十进制数:
第0位:0*2^0=0
第1位:1*2^1=2
第2位:0*2^2=0
第3位:1*2^3=8
所以转换为10进制数为:0+2+0+8=10
二进制转八进制:
利用421,从后往前每三位一组,缺位除补0,然后按十进制方法进行转换。
例如:
(11001)
001=1
011=3
然后将结果按从下往上顶顺序书写:31
二进制转十六进制:
二进制和十六进制的互相转换比较重要。不过这二者的转换却不用计算;利用8421,对于任意一个4位的二进制数,都可以很快算出它对应的10进制值。
例如:
1111=8+4+2+1=15
又因为十六进制数:10~15用大写字母A~F表示,所以15为F。
八进制转二进制:
利用421;从后往前每三位一组,缺位处用0填补,然后按十进制方法进行转化;
例如:
1—>001
3-011
然后我们将结果按从下往上的顺序书写就是:11001,那么这个11001就是八进制31的二进制形式。
八进制转十进制:
八进制就是逢8进1,八进制数采用 0~7这八数来表达一个数;八进制数第0位的权值为8的0次方,第1位权值为8的1次方,第2位权值为8的2次方……
例如:
1507
第0位:7*8^0=7
第1位:0*8^1=0
第2位:5*8^2=320
第3位:1*8^3=512
所以换算成十进制:7+0+320+512=839
八进制转十六进制:
八进制转换成十六进制:有两种方法:一种是先将八进制转换成二进制,在将二进制转换成十六进制。另一种方法是
将八进制转换成十进制,在将十进制转换成十六进制。 十六进制转二进制:
上面已经提到二进制转换成十六进制的方法,记住8421,每一位的权值,所以十六进制转成二进制就是一段四位分别转成二进制。
例如:F1111 ,D1101,A1010,50101
十六进制转八进制:
十六进制转八进制也不能直接转换,需要将十六进制转换成十进制或者二进制,才能由十进制或者二进制转换成八进制。 十六进制转十进制:
16进制就是逢16进1,但我们只有0~9这十个数字,所以我们用A,B,C,D,E,F这六个字母来分别表示10,11,12,13,14,15。
十六进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方〃〃〃〃〃〃
所以,在第N(N从0开始)位上,如果是是数 X (X 大于等于0,并且X小于等于 15,即:F)表示的大小为 X * 16的N次方。
例如:
2AF5
第0位:5*16^0=5
第1位:F*16^1=240
c语言进制转换篇五:C语言进制转换课程设计
课 程 设 计
进制转换
课程设计名称: 数据结构课程设计专 业 班 级 : 学 生 姓 名 : 学 号 : 指 导 教 师 : 设 计 时 间 :
计算机 专业课程设计任务书
目录
一、转换概述 .............................................................................................................................................. 2 1、需求分析 ............................................................................................................................................ 2 2、概要设计 ............................................................................................................................................ 3 3.详细设计 .............................................................................................................................................. 5 1.十进制转化为任意进制函数: ................................................................................................... 5 2.任意进制转化十进制函数: ....................................................................................................... 6 3.程序流程图 ..................................................................................................................................... 7 4.运行环境 ............................................................................................................................................ 11 5.开发工具和编程语言 ........................................................................................................................ 12 二、数学原理 ............................................................................................................................................ 13 十进制转二进制: ................................................................................................................................ 13 十进制转八进制: ................................................................................................................................ 13 十进制转十六进制: ............................................................................................................................ 14 二进制转十进制: ................................................................................................................................ 14 二进制转八进制: ................................................................................................................................ 14 二进制转十六进制: ............................................................................................................................ 15 八进制转十进制: ................................................................................................................................ 15 八进制转十六进制: ............................................................................................................................ 16 十六进制转二进制: ............................................................................................................................ 16 十六进制转八进制: ............................................................................................................................ 16 三、程序编码 ............................................................................................................................................ 17 测试结果 ............................................................................................................................................... 22 参考文献 ................................................................................................................................................ 25 四、心得体会 ............................................................................................................................................ 27
一、转换概述 1、需求分析
进制数制是人们利用符号进行计数的科学方法。数制有很多种,在计算机中常用的数
制有:十进制,二进制、八进制和十六进制。十六进制数有两个基本特点:它由十六个字符0~9以及A,B,C,D,E,F组成(它们分别表示十进制数0~15),十六进制数运算规律是逢十六进一。 要求:
(1) 输入一个十进制数N,将它转换成R进制数输出,并可以进行逆转换。 (2) 输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R
(2<=R<=16, R<>10)。
(3) 为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应
的数字规则参考16进制(比如,10用A表示,等等)。 (4) 界面友好。
2、概要设计
数制转换器程序是要求任意两种数间的相互转化,本次课程设计以任意进制间转换为中心实现二进制、八进制、十进制、十六进制、十八进制之间的相互转化。对输入的任意进制的数字进行转换,实现常见进制间的转换以及用户自定义需要转换的目标进制数,这样大大提高了本程序的用途。常见的二进制、八进制、十进制、十六进制、十六进制之间的固定转换,其转换方式大同小异,从低进制数向高进制数转换进行乘数累加,反之则逐步求余,最终进行分布计算得到想要的结果,对以上思想进行扩展,使其不仅仅局限于那些常见进制间的转换,更多的应用到任意进制之间的转换。本次系统程序,主要有两大模块组成,即任意进制转换为十进制、十进制转换为任意进制,这两部分共同组成了对任意进制数的转换的实现,通过菜单选择,让用户实现自己想要的结果,同时也在程序的简洁上有所压减,达到简洁的应用程序实现相对较复杂的功能。最后打印输出结果,清屏执行下次任务。
该程序包括七个子函数模块,其中菜单函数模块定义为整型,其余字符转换函数处理模块都根据函数所需定义数据类型。数制转换器处理系统中用数组来储存处十进制以外的数,将一个指定进制的数,从低到低高一位一位取出,并计算出每位的十进制值,然后乘
以其数基的特定幂指数,得出这一位数的十进制值,将所有各位的十进制值相加得出这个数的十进制值,然后再将该十进制数转换为指定数制的数,此过程采用求余法进行,用这个十进制数作为被除数,用指定的数基作除数,连续求余,得出的余数依由个位到十位等的顺序组成新数,即得指定数制的数。
(1)逻辑设计如图所示:
图2.1
c语言进制转换篇六:c语言进制转化
1.2 进位计数制及其转换
计算机能够处理数值、文字、声音、图像等信息。读者也许会问:为什么作为电子设备的计算机能处理那么多复杂的信息呢?实际上,当把这些信息转换成计算机能识别的形式就能进行处理。目前计算机中所有的信息都用“0”和“1”两个数字符号组合的二进制数来表示。 数值、图形、文字等各种形式的信息,需要计算机加工处理时,首先必须按一定的法则转换成二进制数。本节将首先以常用的十进制为出发点,来讨论二进制、八进制及十六进制的特点,然后介绍各种进制数之间的转换方法。
1.2.1 十进制数的表示
进位计数制是一种计数的方法,习惯上最常用的是十进制计数法。十进制数的每位数可以用下列10个数码之一来表示:0、1、2、3、4、5、6、7、8、9。十进制数的基数为10,基数表示进位制所具有的数码的个数。
十进制数的计数规则是“逢十进一”,也就是说,每位累计不能超过9,计满10就应向高位进1。
一般来讲,任意一个十进制数N,可以用位置计数法表示如下:
(N )10 = (an–1an–2…a1a0.a–1a–2…a–m)10
也可以用按权展开式表示如下:
(N )10 = an–1 × 10n–1 + an–2 × 10n–2 + … + a1 × 101 + a0 × 100
+ a–1 × 10–1 + a–2 × 10–2 + … + a–m × 10–m
=
式中,ai表示各个数字符号为0~9这10个数码中的任意一个;n为整数部分的位数,m为小数部分的位数;10i为该位数字的权。例如:
(1234.56)10 = 1 × 103 + 2 × 102 + 3 × 101 + 4 × 100 + 5 × 10–1 + 6 × 10–2
通常,对十进制数的表示,可以在数字的右下角标注10或D。
1.2.2 二进制数、八进制数和十六进制数的表示
计算机中为了便于存储及计算的物理实现,采用了二进制。二进制数的基数为2,只有0、1两个数码,其计数规则是“逢二进一”,即每位计满2就向高位进1。它的各位的权是以2i表示的。
对于任意一个二进制数N,用位置计数法表示为:
(N )2 = (an–1an–2…a1a0.a–1a–2…a–m)2
用按权展开式表示为:
?(N )2 = an–1 × 2n–1 + an–2 × 2n–2 + … + a1 × 21 + a0 × 20
??+ a–1 × 2–1 + a–2 × 2–2 + … + a–m × 2–m
=
式中,ai表示各个数字符号为0或1这两个数码中的任意一个;n为整数部分的位数,m为小数部分的位数;2i为该位数字的权。例如:
(101101)2 = 1 × 25 + 0 × 24 + 1 × 23 + 1 × 22 + 0 × 21 + 1 × 20 = (45)10
通常,对二进制数的表示,可以在数字的右下角标注2或B。
二进制数运算规则简单,便于电路实现,它是数字系统中广泛采用的一种数制。但因二进制表示一个数时,所用的位数比用十进制数表示的位数多,人们读写很不方便,容易出错。因此常采用八进制或十六进制。C语言程序设计中就经常会用到这两种进制。
八进制数的基数是8,采用的数码是0、1、2、3、4、5、6、7。计数规则是“逢八进一”,它的各位的权是以8i表示的。通常,对八进制数的表示,可以在数字的右下角标注8或O,但在C语言中是在数的前面加数字0来表示。例如,(1234)8就是表示一个八进制数,而不是十进制数1234,在C语言中它表示为01234。
十六进制数的基数是16,采用的数码是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。其中A、B、C、D、E、F分别表示十进制数字10、11、12、13、14、15。十六进制的计数规则是“逢十六进一”,它的各位的权是以16i表示的。通常,对十六进制数的表示,可以在数字的右下角标注16或H,但在C语言中是在数的前面加数字0和字母X即0X来表示。例如,(12AF)16就是表示一个十六进制数,在C语言中它表示为0X12AF。 由此可得出:十进制、八进制、二进制与十六进制的特征对照表如表1-1所示。 表1-1 二进制、八进制、十进制与十六进制的特征对照表
进 制
数 码
计 数 规 则
数的表示法
十进制
0、1、2、3、4、5、6、7、8、9
逢十进一
(1234)10
二进制
0、1
逢二进一
(1101)2
八进制
0、1、2、3、4、5、6、7
逢八进一
(4567)8
十六进制
0~9、A、B、C、D、E、F
逢十六进一
(45AF)16
1.2.3 二进制数和十进制数的转换
1.二进制转换为十进制数
二进制数转换成十进制数是很方便的,只要将二进制数写成按权展开式,并将式中各乘积项的积计算出来,然后各项相加,即可得到与该二进制数相对应的十进制数。例如: (11010.101)2 = 1 × 24 + 1 × 23 + 0 × 22 + 1 × 21 + 0 × 20
??+ 1 × 2–1 + 0 × 2–2 + 1 × 2–3
= 16 + 8 + 2 + 0.5 + 0.125
=(26.625)10
2.十进制转换为二进制数
十进制数转换成二进制数分成整数部分转换和小数部分转换,下面分别来介绍它们转换的方法。
(1)整数部分转换
把要转换的十进制数的整数部分不断除以基数2,并记下余数,直到商为0为止。
【例1-1】 (N )10 = (117)10
117 / 2 = 58 (a0 = 1) 最低整数位
58 / 2 = 29 (a1 = 0)
29 / 2 = 14 (a2 = 1)
14 / 2 = 7 (a3 = 0)
7 / 2 = 3 (a4 = 1)
3 / 2 = 1 (a5 = 1)
1 / 2 = 0 (a6 = 1) 最高整数位
所以 (N )10 = (1110101)2。
注意:对于整数部分的转换第一次除以2所得到的余数是二进制数整数的最低位,最后所得到的余数是二进制数整数的最高位。
(2)小数部分转换
对于被转换的十进制数的小数部分则应不断乘以基数2,并记下其整数部分,直到结果的小数部分为0为止。
【例1-2】 (N )10 = (0.8125)10
0.8125 × 2 = 1.625 (b1 = 1) 最高小数位
0.625 × 2 = 1.25 (b2 = 1)
0.25 × 2 = 0.5 (b3 = 0)
0.5 × 2 = 1.0 (b4 = 1) 最低小数位
所以 (N )10 = (0.1101)2。
注意:对于小数部分的转换式中的整数不参加连乘,第一次乘以2所得到的整数部分是二进制数小数的最高位,最后所得到的整数部分是二进制数小数的最低位。
在十进制的小数部分转换中,有时连续乘以2不一定能使小数部分等于0,这说明该十进制小数不能用有限位二进制小数表示。这时,只要取足够多的位数,使其误差达到所要求的精度就可以了。
十进制数转换成二进制数的这种方法其实也适用于十进制数转换成其他进制的数,只是基数不再是2,而是要转换的进制数的基数。下面的例子是将一个十进制数转换成八进制数。
【例1-3】 (N )10 = (117)10
117 / 8 = 14 (a0 = 5) 最低整数位
14 / 8 = 1 (a1 = 6)
1 / 8 = 0 (a2 = 1) 最高整数位
所以 (N )10 = (165)8。
【例1-4】 (N )10 = (0.8125)10
0.8125 × 8 = 6.5 (b1 = 6) 最高小数位
0.5 × 8 = 4.0 (b2 = 4) 最低小数位
所以 (N )10 = (0.64)8。
1.2.4 二进制数、八进制数和十六进制数的转换
八进制数的基数是8(8 = 23),十六进制数的基数是16(16 = 24)。二进制数、八进制数和十六进制数之间具有2的整指数倍的关系,因而可直接进行转换。
1.二进制数 → 八进制数
从小数点开始,分别向左、右按3位分组转换成对应的八进制数字字符,最后不满3位的,则需补0。
【例1-5】 将二进制数(1101101.10101)2转换成八进制数。
具体方法为:
二进制数:
1 0 1
1 0 1
.
1 0 1
0 1 0
↓
↓
↓
↓
↓
八进制数:
1
5
5
.
5
2
所以 (1101101.10101)2 = (155.52)8。
2.八进制数 → 二进制数
将每位八进制数用3位二进制数表示即可。
【例1-6】 将八进制数(345.64)8转换成二进制数。
具体方法为:
八进制数:
3
4
5
.
6
4
↓
↓
↓
↓
↓
二进制数:
011
110
101
.
100
所以 (345.64)8 = (11100101.1101)2。
3.二进制数 → 十六进制数
从小数点开始,分别向左、右按4位分组转换成对应的十六进制数字字符,最后不满4位的,则需补0。
【例1-7】 将二进制数(1101101.10101)2转换成十六进制数。
具体方法为:
二进制数:
0 1 1 0
1 1 0 1
.
1 0 1 0
1 0 0 0
↓
↓
↓
↓
十六进制数:
6
D
.
A
8
所以 (1101101.10101)2 = (6D.A8)16。
4.十六进制数 → 二进制数
将每位十六进制数用4位二进制表示即可。
【例1-8】 将十六进制数(A8D.6C)16转换成二进制数。
具体方法为:
十六进制数:
A
8
D
.
6
C
↓
↓
↓
↓
c语言进制转换篇七:C++ C语言 进制转换大全
c语言字符串 数字转换函数大全
c语言字符串 数字转换函数大全收藏
atof(将字符串转换成浮点型数)
atoi(将字符串转换成整型数)
atol(将字符串转换成长整型数)
strtod(将字符串转换成浮点数)
strtol(将字符串转换成长整型数)
strtoul(将字符串转换成无符号长整型数)
toascii(将整型数转换成合法的ASCII 码字符)
toupper(将小写字母转换成大写字母)
tolower(将大写字母转换成小写字母)
atof(将字符串转换成浮点型数)
相关函数 atoi,atol,strtod,strtol,strtoul
表头文件 #include <stdlib.h>
定义函数 double atof(const char *nptr);
函数说明 atof()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数 字或正负符号才开始做转换,而再遇到非数字或字符串结束时 ('\0')才结束转换,并将结果返回。参数nptr字符串可包含正负 号、小数点或E(e)来表示指数部分,如123.456或123e-2。
返回值 返回转换后的浮点型数。
附加说明 atof()与使用strtod(nptr,(char**)NULL)结果相同。
范例 /* 将字符串a 与字符串b转换成数字后相加*/
#include<stdlib.h>
main()
{
char *a=”-100.23”;
char *b=”200e-2”;
float c;
c="atof"(a)+atof(b);
printf(“c=%.2f\n”,c);
}
执行 c="-98".23
atoi(将字符串转换成整型数)
相关函数 atof,atol,atrtod,strtol,strtoul
表头文件 #include<stdlib.h>
定义函数 int atoi(const char *nptr);
函数说明 atoi()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数 字或正负符号才开始做转换,而再遇到非数字或字符串结束时 ('\0')才结束转换,并将结果返回。
返回值 返回转换后的整型数。
附加说明 atoi()与使用strtol(nptr,(char**)NULL,10);结果相同。
范例 /* 将字符串a 与字符串b转换成数字后相加*/
#include<stdlib.h>
mian()
{
char a[]=”-100”;
char b[]=”456”;
int c;
c="atoi"(a)+atoi(b);
printf(c=%d\n”,c);
}
执行 c="356"
atol(将字符串转换成长整型数)
相关函数 atof,atoi,strtod,strtol,strtoul
表头文件 #include<stdlib.h>
定义函数 long atol(const char *nptr);
函数说明 atol()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数 字或正负符号才开始做转换,而再遇到非数字或字符串结束时 ('\0')才结束转换,并将结果返回。
返回值 返回转换后的长整型数。
附加说明 atol()与使用strtol(nptr,(char**)NULL,10);结果相同。
范例 /*将字符串a与字符串b转换成数字后相加*/
#include<stdlib.h>
main()
{
char a[]=”1000000000”;
char b[]=” 234567890”;
long c;
c="atol"(a)+atol(b);
printf(“c=%d\n”,c);
}
执行 c="1234567890"
gcvt(将浮点型数转换为字符串,取四舍五入)
相关函数 ecvt,fcvt,sprintf
表头文件 #include<stdlib.h>
定义函数 char *gcvt(double number,size_t ndigits,char *buf);
函数说明 gcvt()用来将参数number转换成ASCII码字符串,参数ndigits表示 显示的位数。gcvt()与ecvt()和fcvt()不同的地方在于,gcvt()所 转换后的字符串包含小数点或正负符号。若转换成功,转换后的字
符串会放在参数buf指针所指的空间。
返回值 返回一字符串指针,此地址即为buf指针。
附加说明
范例 #include<stdlib.h>
main()
{
double a="123".45;
double b="-1234".56;
char *ptr;
int decpt,sign;
gcvt(a,5,ptr);
printf(“a value=%s\n”,ptr);
ptr="gcvt"(b,6,ptr);
printf(“b value=%s\n”,ptr);
}
执行 a value="123".45
b value="-1234".56
strtod(将字符串转换成浮点数)
相关函数 atoi,atol,strtod,strtol,strtoul
表头文件 #include<stdlib.h>
定义函数 double strtod(const char *nptr,char **endptr);
函数说明 strtod()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上 数字或正负符号才开始做转换,到出现非数字或字符串结束时 ('\0')才结束转换,并将结果返回。若endptr不为NULL,则会将遇
到不合条件而终止的nptr中的字符指针由endptr传回。参数nptr字 符串可包含正负号、小数点或E(e)来表示指数部分。如123.456或 123e-2。
返回值 返回转换后的浮点型数。
附加说明 参考atof()。
范例 /*将字符串a,b,c 分别采用10,2,16 进制转换成数字*/
#include<stdlib.h>
mian()
{
char a[]=”1000000000”;
char b[]=”1000000000”;
char c[]=”ffff”;
printf(“a=%d\n”,strtod(a,NULL,10));
printf(“b=%d\n”,strtod(b,NULL,2));
printf(“c=%d\n”,strtod(c,NULL,16));
}
执行 a="1000000000"
b="512"
c="65535"
strtol(将字符串转换成长整型数)
相关函数 atof,atoi,atol,strtod,strtoul
表头文件 #include<stdlib.h>
定义函数 long int strtol(const char *nptr,char **endptr,int base);
函数说明 strtol()会将参数nptr字符串根据参数base来转换成长整型数。参 数base范围从2至36,或0。参数base代表采用的进制方式,如base 值为10则采用10进制,若base值为16则采用16进制等。当base值为0 时则是采用10进制做转换,但遇到如'0x'前置字符则会使用16进制 做转换。一开始strtol()会扫描参数nptr字符串,跳过前面的空格 字符,直到遇上数字或正负符号才开始做转换,再遇到非数字或字 符串结束时('\0')结束转换,并将结果返回。若参数endptr不为
NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr返 回。
c语言进制转换篇八:c语言进制转换代码
#include<stdio.h>
#include<stdlib.h>
#define stack_size 100
#define stack_extra_size 10
typedefstruct
{
int *base;
int *top; intstacksize;
}stack,*pstack;
voidinitstack(stack &s)
{
s.base=(int *)malloc(stack_size*sizeof(int));
s.top=s.base;
} s.stacksize=stack_size;
void push(stack &s,int e)
{
if(s.top-s.base>=s.stacksize)
{ } s.base=(int *)realloc(s.base,(stack_size+stack_extra_size)*sizeof(int)); if(!s.base )exit(-1); s.top=s.base+s.stacksize; s.stacksize+=stack_extra_size;
*s.top=e;s.top++;
}
int pop(stack &s,int&e)
{
if(s.top==s.base ) return 0;
else { } e=*(--s.top);return 1;
}
intstackempty(stack s)
{
if(s.top==s.base )return 1; else return 0;
}
voiddatechange(inta,int N)
{
stack s; int e;
} while(a) { push(s,a%N); a/=N; } while(!stackempty(s)) { pop(s,e); printf("%d",e); }printf("\n");
voidsixteenchange(int n)
{
int e; stacks;initstack(s);
while(n)
{
push(s,n%16);
}
{
} n/=16; while(!stackempty(s)) { pop(s,e); switch(e) { case 10:printf("A");break; case 11:printf("B");break; case 12:printf("C");break; case 13:printf("D");break; case 14:printf("E");break; case 15:printf("F");break; default :printf("%d",e);break; } }printf("\n"); void main() intn,N;char k=' ';
printf("请输入您想要从10进制转换后的进制数:(一般有几种,大于等于10的只有16进制)");
scanf("%d",&N); printf("请输入一些10进制数,然后转换为%d进制\n",N); while(k!='#')
printf("请输入一个数:"); scanf("%d",&n); printf("转化为%d进制后为:",N); if(N==16) sixteenchange(n);
elsedatechange(n,N);
printf("还想继续吗? \n继续请按其他键,结束请按#键:");
} getchar(); scanf("%c",&k); }
c语言进制转换篇九:C语言课程设计二八十六进制转化
目 录
1前言 ........................................................................................................ 1 2.需求分析 ................................................................................................ 1 2.2 课程设计任务............................................................................... 1 2.3 设计环境 ...................................................................................... 1 2.4 开发语言 ...................................................................................... 1 3 分析和设计............................................................................................ 1 3.1 模块设计 ...................................................................................... 1 3.2 系统流程图 .................................................................................. 2 4 具体代码实现 ........................................................................................ 8 5 课程设计总结 ...................................................................................... 12 5.1 程序运行结果........................................................................... 12 5.2 课程设计体会............................................................................. 16 参考文献 ................................................................................................. 16 致 谢 ..................................................................................................... 16
1前言
编写一个C语言程序实现二,八,十六进制的数值转换。通过一个main函数,再调用几个函数,分别实现各种进制的转换。
2.需求分析 2.1 课程设计目的
学生在教师指导下运用所学课程的知识来研究、解决一些具有一定综合性问题的专业课题。通过课程设计(论文),提高学生综合运用所学知识来解决实际问题、使用文献资料、及进行科学实验或技术设计的初步能力,为毕业设计(论文)打基础。
2.2 课程设计任务
以用户想用的任意进制数输入,然后转换成用户想得到的任意另外一种进制的数。至少完成二,八,十六进制数的任意转换。
2.3 设计环境
(1)WINDOWS 2000/2003XP/7/Vista系统
(2)Visual C++或TC集成开发环境 2.4 开发语言
C语言 3 分析和设计 3.1 模块设计
定义5个子函数hex(x) , octal(x),decimal(x),f1,f2来实现二,八,十六进制的转换。编写一个main函数,输入任意进制数(2,8,10),都先将其转换成十进制,再通过判断,调用函数,实现再转换。如下所示:
定义函数hex(x),将x(十进制)转换为十六进制数; 定义函数octal(x)将x转换为八进制数; 定义函数decimal(x)将x转换为二进制数; 定义函数f1将二进制转换为十进制; 定义函数f2将八进制转换为十进制。
1
3.2 系统流程图
3.3 主要模块的流程图
3
4
c语言进制转换篇十:(C语言)10进制转换2,8,16进制
(C语言)10进制转换2,8,16进制
作者:vinseven
#include"stdio.h"
#include"conio.h"
#include"malloc.h"
#include"windows.h"
#define ElemType int
void menu();
void TenToTwo();
void TenToEight();
void TenToSixteen();
void InitStack(struct sNode **HS);
void Push(struct sNode **HS,ElemType x);
ElemType Pop(struct sNode **HS);
ElemType Peek(struct sNode **HS);
int EmptyStack(struct sNode **HS);
void ClearStack(struct sNode **HS);
int ten;/*要输入的10进制数*/
int x;/*把将要插入到栈中的元素暂时存进 x 中*/ struct sNode hs;
struct sNode
{
};
void main()
{
menu();
getch();
}
void menu()
{
char choice; int flag=1; while(1) { printf("\n\t\t\t________________________\n\n\n"); printf("\t\t\t 1,10进制转换2进制\n\n\n"); printf("\t\t\t 2,10进制转换8进制\n\n\n"); printf("\t\t\t 3,10进制转换16进制\n\n\n"); printf("\t\t\t 0,退出\n\n\n"); ElemType data; struct sNode *next;
printf("\t\t\t请输入编号:"); while(flag) { fflush(stdin); choice=getch(); switch(choice) { case '1': {system("cls"); TenToTwo(); flag=0; break; } case '2': { system("cls"); TenToEight(); flag=0; break; }
} } { system("cls"); TenToSixteen(); flag=0; break; } case '0': { printf("\n\t\t\t按任意键退出"); getch(); exit(0); } default: { printf("\n\t\t\t无此选项可选!请重新输入!\n"); flag=1; break; }
flag=1;
}
}
/*10进制转换2进制界面*/ void TenToTwo() {
printf("\n\t\t\t________________________\n\n\n"); printf("\t\t\t 10进制转换2进制界面\n\n\n"); printf("\t\t\t________________________\n\n"); printf("\t\t\t请输入10进制数:"); scanf("%d",&ten); while(ten!=0) { } x=ten%2; Push(&hs,x); ten=ten/2;
printf("\t\t\t二进制数为:"); while(!EmptyStack(&hs))