C语言中的各种进制转换

一、正数


  1. 十 -------> 二


    2. 二 -------> 十


  3. 十 -------> 八


  4. 八 -------> 十


  6. 十六------> 十 


二、负数


 

  正文:


  一、正数


  在高速发展的现代社会,计算机浩浩荡荡地成为了人们生活中不可缺少的一部分,帮助人们解决通信,联络,互动等各方面的问题。今天我就给大家讲讲与计算机有关的“进制转换”问题。 


  我们以(25.625)(十)为例讲解一下进制之间的转化问题 


  说明:小数部份的转化计算机二级是不考的,有兴趣的人可以看一看 


  1. 十 -----> 二


  (25.625)(十) 


  整数部分:


  25/2=12......1


  12/2=6 ......0


  6/2=3 ......0


  3/2=1 ......1


  1/2=0 ......1


  然后我们将余数按从下往上的顺序书写就是:11001,那么这个11001就是十进制25的二进制形式 


  小数部分:


  0.625*2=1.25


  0.25 *2=0.5


  0.5 *2=1.0


  然后我们将整数部分按从上往下的顺序书写就是:101,那么这个101就是十进制0.625的二进制形式 


  所以:(25.625)(十)=(11001.101)(二) 


  十进制转成二进制是这样: 


  把这个十进制数做二的整除运算,并将所得到的余数倒过来. 


  例如将十进制的10转为二进制是这样: 


  (1) 10/2,商5余0;  


  (2) 5/2,商2余1; 


  (3)2/2,商1余0;  


  (4)1/2,商0余1.  


  (5)将所得的余数侄倒过来,就是1010,所以十进制的10转化为二进制就是1010  


  2. 二 ----> 十 


  (11001.101)(二) 


  整数部分: 下面的出现的2(x)表示的是2的x次方的意思


  1*2(4)+1*2(3)+0*2(2)+0*2(1)+1*2(0)=25 


  小数部分:  


  1*2(-1)+0*2(-2)+1*2(-3)=0.625 


  所以:(11001.101)(二)=(25.625)(十) 


  二进制转化为十进制是这样的:  


  这里可以用8421码的方法.这个方法是将你所要转化的二进制从右向左数,从0开始数(这个数我们叫N),在位数是1的地方停下,并将1乘以2的N次方,最后将这些1乘以2的N次方相加,就是这个二进数的十进制了.  


  还是举个例子吧:  


  求110101的十进制数.从右向左开始了  


  (1) 1乘以2的0次方,等于1;  


  (2) 1乘以2的2次方,等于4;  


  (3) 1乘以2的4次方,等于16;  


  (4) 1乘以2的5次方,等于32; 


  (5) 将这些结果相加:1+4+16+32=53 


  3. 十 ----> 八


  (25.625)(十) 


  整数部分: 


  25/8=3......1 


  3/8 =0......3 


  然后我们将余数按从下往上的顺序书写就是:31,那么这个31就是十进制25的八进制形式 


  小数部分: 


  0.625*8=5 


  然后我们将整数部分按从上往下的顺序书写就是:5,那么这个0.5就是十进制0.625的八进制形式 


  所以:(25.625)(十)=(31.5)(八)


  4. 八 ----> 十 


  (31.5)(八) 


  整数部分: 


  3*8(1)+1*8(0)=25  


  小数部分:


  5*8(-1)=0.625


  所以(31.5)(八)=(25.625)(十)


  5. 十 ----> 十六


(25.625)(十)


  整数部分:


  25/16=1......9


  1/16 =0......1


  然后我们将余数按从下往上的顺序书写就是:19,那么这个19就是十进制25的十六进制形式


  小数部分:


  0.625*16=10(即十六进制的A或a) 


  然后我们将整数部分按从上往下的顺序书写就是:A,那么这个A就是十进制0.625的十六进制形式 


  所以:(25.625)(十)=(19.A)(十六) 


  6. 十六----> 十


(19.A)(十六)


  整数部分:


  1*16(1)+9*16(0)=25


  小数部分:


  10*16(-1)=0.625 


  所以(19.A)(十六)=(25.625)(十) 


  如何将带小数的二进制与八进制、十六进制数之间的转化问题


  我们以(11001.101)(二)为例讲解一下进制之间的转化问题


  说明:小数部份的转化计算机二级是不考的,有兴趣的人可以看一看 


  1. 二 ----> 八


(11001.101)(二) 


  整数部分: 从后往前每三位一组,缺位处用0填补,然后按十进制方法进行转化, 则有: 


  001=1 


  011=3


  然后我们将结果按从下往上的顺序书写就是:31,那么这个31就是二进制11001的八进制形式


  小数部分: 从前往后每三位一组,缺位处用0填补,然后按十进制方法进行转化, 则有: 


  101=5


  然后我们将结果部分按从上往下的顺序书写就是:5,那么这个5就是二进制0.101的八进制形式


  所以:(11001.101)(二)=(31.5)(八)


  2. 八 ----> 二


(31.5)(八) 


  整数部分:从后往前每一位按十进制转化方式转化为三位二进制数,缺位处用0补充 则有:


  1---->1---->001


  3---->11


  然后我们将结果按从下往上的顺序书写就是:11001,那么这个11001就是八进制31的二进制形式


  说明,关于十进制的转化方式我这里就不再说了,上一篇文章我已经讲解了!


  小数部分:从前往后每一位按十进制转化方式转化为三位二进制数,缺位处用0补充 则有:


  5---->101


  然后我们将结果按从下往上的顺序书写就是:101,那么这个101就是八进制5的二进制形式


  所以:(31.5)(八)=(11001.101)(二)


  3. 十六 ----> 二


  (19.A)(十六)


  整数部分:从后往前每位按十进制转换成四位二进制数,缺位处用0补充 则有:


  9---->1001


  1---->0001(相当于1)


  则结果为00011001或者11001 


  小数部分:从前往后每位按十进制转换成四位二进制数,缺位处用0补充 则有:


  A(即10)---->1010


  所以:(19.A)(十六)=(11001.1010)(二)=(11001.101)(二)


  4. 二 ----> 十六


  (11001.101)(二)


  整数部分:从后往前每四位按十进制转化方式转化为一位数,缺位处用0补充 则有: 


  1001---->9


  0001---->1


  则结果为19


  小数部分:从前往后每四位按十进制转化方式转化为一位数,缺位处用0补充 则有:


  1010---->10---->A


  则结果为A


  所以:(11001.101)(二)=(19.A)(十六)二、负数


  负数的进制转换稍微有些不同。


  先把负数写为其补码形式(在此不议),然后再根据二进制转换其它进制的方法进行。


  例:要求把-9转换为八进制形式。则有:


  -9的补码为11110111。然后三位一划


  111---->7 


  110---->6


  011---->3


  然后我们将结果按从下往上的顺序书写就是:367,那么367就是十进制数-9的八进制形式。  


  补充:


  最近有些朋友提了这样的问题“0.8的十六进制是多少?”


  我想在我的空间里已经有了详细的讲解,为什么他还要问这样的问题那 


  于是我就动手算了一下,发现0.8、0.6、0.2... ...一些数字在进制之间的转化


  过程中确实存在麻烦。


  就比如“0.8的十六进制”吧!


  无论你怎么乘以16,它的余数总也乘不尽,总是余8


   具体方法如下:


  0.8*16=12.8 


  0.8*16=12.8  


  .  


  取每一个结果的整数部分为12既十六进制的C  


  如果题中要求精确到小数点后3位那结果就是0.CCC  


  如果题中要求精确到小数点后4位那结果就是0.CCCC  


  现在OK了,我想我的朋友再也不会因为进制的问题烦愁了!  


  下面是将十进制数转换为负R进制的公式: 


  N=(dmdm-1...d1d0)-R 


        =dm*(-R)^m+dm-1*(-R)^m-1+...+d1*(-R)^1+d0*(-R)^0 


  15=1*(-2)^4+0*(-2)^3+0*(-2)^2+1*(-2)^1+1*(-2)^0 


  =10011(-2) 


  其实转化成任意进制都是一样的


转自http://yu-ping.blog.163.com/blog/static/13461001620091122104992/

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值