admin 管理员组文章数量: 1086019
2024年12月22日发(作者:php文本密钥加密解密)
◆十进制转二进制:
二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。
它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大
师莱布尼兹发现。当前计算机系统使用的基本上是二进制系统。
用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+2+0
+8+0+32+64+0=107.
二进制01101011=十进制107.
好了,现在对二进制和十进制之间的换算有了初步的了解了吧,下面,我们
就进一步深入了解二者之间的其他换算规律:
二进制转十进制,十进制转二进制的算法
一、二进制数转换成十进制数
由二进制数转换成十进制数的基本做法是,把二进制数首先写成加权
系数展开式,然后按十进制加法规则求和。这种做法称为"按权相加"
法。
二、十进制数转换为二进制数
十进制数转换为二进制数时,由于整数和小数的转换方法不同,所以
先将十进制数的整数部分和小数部分分别转换后,再加以合并。
1. 十进制整数转换为二进制整数
十进制整数转换为二进制整数采用"除2取余,逆序排列"法。具体做
法是:用2去除十进制整数,可以得到一个商和余数;再用2去除商,
又会得到一个商和余数,如此进行,直到商为零时为止,然后把先得
到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的
高位有效位,依次排列起来。
2.十进制小数转换为二进制小数
十进制小数转换成二进制小数采用"乘2取整,顺序排列"法。具体做
法是:用2乘十进制小数,可以得到积,将积的整数部分取出,再用
2乘余下的小数部分,又得到一个积,再将积的整数部分取出,如此
进行,直到积中的小数部分为零,或者达到所要求的精度为止。
然后把取出的整数部分按顺序排列起来,先取的整数作为二进制小数
的高位有效位,后取的整数作为低位有效位。
1.二进制与十进制的转换
(1)二进制转十进制
方法:"按权展开求和"
例:
(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.十六进制与二进制的转换
例:将十六进制数5DF.9 转换成二进制:
5 D F . 9
0101 1101 1111.1001
即:(5DF.9)16 =(1.1001)2
例:将二进制数1100001.111 转换成十六进制:
0110 0001 . 1110
6 1 . E
即:(1100001.111)2 =(61.E)16
二进制,八进制十进制十六进制之间数据转换
.
十进制转二进制(整数及小数部分):
1、把该十进制数,用二因式分解,取余。
以235为例,转为二进制
235除以2得117,余1
117除以2得58,余1
58除以2得29,余0
29除以2得14,余1
14除以2得7,余0
7除以2得3,余1
3除以2得1,余1
从得到的1开始写起,余数倒排,加在它后面,就可得11101011。
2、把十进制中的小数部份,转为二进制。
把该小数不断乘2,取整,直至没有小数为止,注意不是所有小数都能转为二进制!
以0.75为例,
0.75剩以2得1.50,取整数1
0.50剩以2得1,取整数1,顺序取数就可得0.11。
1、二进制数、八进制数、十六进制数转十进制数
有一个公式:二进制数、八进制数、十六进制数的各位数字分别乖以各自的基数的(N-1)次
方,其和相加之和便是相应的十进制数。个位,N=1;十位,举例:
110B=1*2的2次方+1*2的1次方+0*2的0次方=0+4+2+0=6D
110Q=1*8的2次方+1*8的1次方+0*8的0次方=64+8+0=72D
110H=1*16的2次方+1*16的1次方+0*16的0次方=256+16+0=272D
2、十进制数转二进制数、八进制数、十六进制数
方法是相同的,即整数部分用除基取余的算法,小数部分用乘基取整的方法,然后将整数与
小数部分拼接成一个数作为转换的最后结果。
例:见四级指导16页。
3、二进制数转换成其它数据类型
3-1二进制转八进制:
从小数点位置开始,整数部分向左,小数部分向右,每三位二进制为一组用一位八进制的数
字来表示,不足三位的用0补足,
就是一个相应八进制数的表示。
010110.001100B=26.14Q
八进制转二进制反之则可。
3-2二进制转十进制:
见1
3-3二进制转十六进制:
从小数点位置开始,整数部分向左,小数部分向右,每四位二进制为一组用一位十六进制的
数字来表示,
不足四位的用0补足,就是一个相应十六进制数的表示。
00100110.00010100B=26.14H
十进制转各进制
要将十进制转为各进制的方式,只需除以各进制的权值,取得其余数,第一次的余数当个位
数,第二次余数当十位数,其余依此类推,直到被除数小于权值,最后的被除数当最高位数。
一、十进制转二进制
如:55转为二进制
2|55
27――1 个位
13――1 第二位
6――1 第三位
3――0 第四位
1――1 第五位
最后被除数1为第七位,即得110111
二、十进制转八进制
如:5621转为八进制
8|5621
702 ―― 5 第一位(个位)
87 ―― 6 第二位
10 ―― 7 第三位
1 ―― 2 第四位
最后得八进制数:12765
三、十进制数十六进制
如:76521转为十六进制
16|76521
4782 ――9 第一位(个位)
298 ――14 即 E 第二位
18 ――10 即 A 第三位
1 ―― 2 第四位
最后得12AE9
二进制与十六进制的关系
2进制 0000 0001 0010 0011 0100 0101 0110 0111
16进制 0 1 2 3 4 5 6 7
2进制 1000 1001 1010 1011 1100 1101 1110 1111
16进制 8 9 a(10) b(11) c(12) d(13) e(14) f(15)
可以用四位数的二进制数来代表一个16进制,如3A16 转为二进制为:
3为0011,A 为1010,合并起来为00111010。可以将最左边的0去掉得1110102
右要将二进制转为16进制,只需将二进制的位数由右向左每四位一个单位分隔,将各单位
对照出16进制的值即可。
二进制与八进制间的关系
二进制 000 001 010 011 100 101 110 111
八进制 0 1 2 3 4 5 6 7
二进制与八进制的关系类似于二进制与十六进制的关系,以八进制的各数为0到7,以三位
二进制数来表示。如要将51028 转为二进制,5为101,1为001,0为000,2为010,将
这些数的二进制合并后为1,即是二进制的值。
若要将二进制转为八进制,将二进制的位数由右向左每三位一个单位分隔,将事单位对照出
八进制的值即可。
二进制、八进制、十进制、十六进制之间转换
Posted on 2008-09-12 00:28 SmartStone 阅读(1868) 评论(2) 编辑 收藏 网摘
一、 十进制与二进制之间的转换
(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
上面的方法大家可以验证一下,你可以先将十进制转换,然后在转换为八进制,这样看得到
的结果是否一样
六、十六进制与十进制的转换
十六进制与八进制有很多相似之处,大家可以参照上面八进制与十进制的转换自己试试这两
个进制之间的转换。
通过上面对各种进制之间的转换,我们可以将前面的转换图重新完善一下:
本文介绍了二进制、十进制、八进制、十六进制四种进制之间相互的转换,大家在转换的时
候要注意转换的方法,以及步骤,特别是十进制转换为期于三种进制之间,要分为整数部分
和小数部分,最后就是小数点的位置。但是要保证考试中不出现错误还是需要大家经常练习,
这样才能熟能生巧。
第六章 二进制、八进制、十六进制
6.1 为什么需要八进制和十六进制?
6.2 二、八、十六进制数转换到十进制数
6.2.1 二进制数转换为十进制数
6.2.2 八进制数转换为十进制数
6.2.3 八进制数的表达方法
6.2.4 八进制数在转义符中的使用
6.2.5 十六进制数转换成十进制数
6.2.6 十六进制数的表达方法
6.2.7 十六进制数在转义符中的使用
6.3 十进制数转换到二、八、十六进制数
6.3.1 10
6.3.2 10
进制数转换为2进制数
进制数转换为8、16进制数
6.4 二、十六进制数互相转换
6.5 原码、反码、补码
6.6 通过调试查看变量的值
6.7 本章小结
这是一节“前不着村后不着店”的课。不同进制之间的转换纯粹是数学上的计算。不过,
你不必担心会有么复杂,无非是乘或除的计算。
生活中其实很多地方的计数方法都多少有点不同进制的影子。
比如我们最常用的10进制,其实起源于人有10个指头。如果我们的祖先始终没有摆脱
手脚不分的境况,我想我们现在一定是在使用20进制。
至于二进制……没有袜子称为0只袜子,有一只袜子称为1只袜子,但若有两袜子,则
我们常说的是:1双袜子。
生活中还有:七进制,比如星期。十六进制,比如小时或“一打”,六十进制,比如分
钟或角度……
(该版课程的内容更新及订正均已停止)
旧版课程打包下载
----------------------------------
[想看涵盖“面向对象”、“图形编程”、“泛型编程”……
的“
最新2008年版 白话C++
”课程,请点击!]
(另有:
博客版
)
6.1 为什么需要八进制和十六进制?
编程中,我们常用的还是10进制……必竟C/C++是高级语言。
比如:
int a = 100,b = 99;
不过,由于数据在计算机中的表示,最终以二进制的形式存在,所以有时候使用二进制,
可以更直观地解决问题。
但,二进制数太长了。比如int 类型占用4个字节,32位。比如100,用int类型的二
进制数表达将是:
0000 0000 0000 0000 0110 0100
面对这么长的数进行思考或操作,没有人会喜欢。因此,C,C++ 没有提供在代码直接写
二进制数的方法。
用16进制或8进制可以解决这个问题。因为,进制越大,数的表达长度也就越短。不
过,为什么偏偏是16或8进制,而不其它的,诸如9或20进制呢?
2、8、16,分别是2的1次方,3次方,4次方。这一点使得三种进制之间可以非常直
接地互相转换。8进制或16进制缩短了二进制数,但保持了二进制数的表达特点。在下面
的关于进制转换的课程中,你可以发现这一点。
6.2 二、八、十六进制数转换到十进制数
6.2.1 二进制数转换为十进制数
二进制数第0位的权值是2的0次方,第1位的权值是2的1次方……
所以,设有一个二进制数:0110 0100,转换为10进制为:
下面是竖式:
0110 0100 换算成 十进制
第0位 0 * 2 = 0
第1位 0 * 2 = 0
1
0
第2位 1 * 2 = 4
第3位 0 * 2 = 0
第4位 0 * 2 = 0
第5位 1 * 2 = 32
第6位 1 * 2 = 64
第7位 0 * 2 = 0 +
---------------------------
100
用横式计算为:
0 * 2+ 0 * 2 + 1 * 2 + 1 * 2 + 0 * 2 + 1 * 2 + 1 * 2 + 0 * 2 = 100
0乘以多少都是0,所以我们也可以直接跳过值为0的位:
1 * 2 + 1 * 2 + 1 * 2 + 1 * 2 = 100
2356
0 1234567
7
6
5
4
3
2
6.2.2 八进制数转换为十进制数
八进制就是逢8进1。
八进制数采用 0~7这八数来表达一个数。
八进制数第0位的权值为8的0次方,第1位权值为8的1次方,第2位权值为8的2
次方……
所以,设有一个八进制数:1507,转换为十进制为:
用竖式表示:
1507换算成十进制。
第0位 7 * 8 = 7
第1位 0 * 8 = 0
第2位 5 * 8 = 320
第3位 1 * 8 = 512 +
--------------------------
839
同样,我们也可以用横式直接计算:
7 * 8 + 0 * 8 + 5 * 8 + 1 * 8
结果是,八进制数 1507 转换成十进制数为 839
0123 =
3
2
1
0
839
6.2.3 八进制数的表达方法
C,C++语言中,如何表达一个八进制数呢?如果这个数是 876,我们可以断定它不是八进
制数,因为八进制数中不可能出7以上的阿拉伯数字。但如果这个数是123、是567,或
12345670,那么它是八进制数还是10进制数,都有可能。
所以,C,C++规定,一个数如果要指明它采用八进制,必须在它前面加上一个0,如:123
是十进制,但0123则表示采用八进制。这就是八进制数在C、C++中的表达方法。
由于C和C++都没有提供二进制数的表达方法,所以,这里所学的八进制是我们学习的,
CtC++语言的数值表达的第二种进制法。
现在,对于同样一个数,比如是100,我们在代码中可以用平常的10进制表达,例如在
变量初始化时:
int a = 100;
我们也可以这样写:
int a = 0144; //0144是八进制的100;一个10进制数如何转成8进制,我们后面会
学到。
千万记住,用八进制表达时,你不能少了最前的那个0。否则计算机会通通当成10进制。
不过,有一个地方使用八进制数时,却不能使用加0,那就是我们前面学的用于表达字符的
“转义符”表达法。
6.2.4 八进制数在转义符中的使用
我们学过用一个转义符''加上一个特殊字母来表示某个字符的方法,如:'n'表示换
行(line),而't'表示Tab字符,'''则表示单引号。今天我们又学习了一种使用转义符
的方法:转义符''后面接一个八进制数,用于表示ASCII码等于该值的字符。
比如,查一下
第5章中的ASCII码表
,我们找到问号字符(?)的ASCII值是63,那
么我们可以把它转换为八进值:77,然后用 '77'来表示'?'。由于是八进制,所以本应写
成 '077',但因为C,C++规定不允许使用斜杠加10进制数来表示字符,所以这里的0可以
不写。
事实上我们很少在实际编程中非要用转义符加八进制数来表示一个字符,所以,6.2.4
小节的内容,大家仅仅了解就行。
6.2.5 十六进制数转换成十进制数
2进制,用两个阿拉伯数字:0、1;
8进制,用八个阿拉伯数字:0、1、2、3、4、5、6、7;
10进制,用十个阿拉伯数字:0到9;
16进制,用十六个阿拉伯数字……等等,阿拉伯人或说是印度人,只发明了10个数字
啊?
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, 那么如何换算成10进制呢?
用竖式计算:
2AF5换算成10进制:
第0位: 5 * 16 = 5
第1位: F * 16 = 240
第2位: A * 16 = 2560
第3位: 2 * 16 = 8192 +
-------------------------------------
10997
直接计算就是:
5 * 16 + F * 16 + A * 16+2 * 16 = 10997
(别忘了,在上面的计算中,A表示10,而F表示15)
现在可以看出,所有进制换算成10进制,关键在于各自的权值不同。
假设有人问你,十进数 1234 为什么是 一千二百三十四?你尽可以给他这么一个算式:
1234 = 1 * 10 + 2 * 10 + 3 * 10 + 4 * 10
3210
012 3
3
2
1
0
6.2.6 十六进制数的表达方法
如果不使用特殊的书写形式,16进制数也会和10进制相混。随便一个数:9876,就看
不出它是16进制或10进制。
C,C++规定,16进制数必须以 0x开头。比如 0x1表示一个16进制数。而1则表示一
个十进制。另外如:0xff,0xFF,0X102A,等等。其中的x也也不区分大小写。(注意:0x中
的0是数字0,而不是字母O)
以下是一些用法示例:
int a = 0x100F;
int b = 0x70 + a;
至此,我们学完了所有进制:10进制,8进制,16进制数的表达方式。最后一点很重要,
C/C++中,10进制数有正负之分,比如12表示正12,而-12表示负12,;但8进制和16
进制只能用达无符号的正整数,如果你在代码中里:-078,或者写:-0xF2,C,C++并不把它
当成一个负数。
6.2.7 十六进制数在转义符中的使用
转义符也可以接一个16进制数来表示一个字符。如在6.2.4小节中说的 '?' 字符,可
以有以下表达方式:
'?' //直接输入字符
'77' //用八进制,此时可以省略开头的0
'0x3F' //用十六进制
同样,这一小节只用于了解。除了空字符用八进制数 '0' 表示以外,我们很少用后两
种方法表示一个字符。
6.3 十进制数转换到二、八、十六进制数
6.3.1 10进制数转换为2进制数
给你一个十进制,比如:6,如果将它转换成二进制数呢?
10进制数转换成二进制数,这是一个连续除2的过程:
把要转换的数,除以2,得到商和余数,
将商继续除以2,直到商为0。最后将所有余数倒序排列,得到数就是转换结果。
听起来有些糊涂?我们结合例子来说明。比如要转换6为二进制数。
“把要转换的数,除以2,得到商和余数”。
那么:
要转换的数是6, 6 ÷ 2,得到商是3,余数是0。 (不要告诉我你不会计算6÷3!)
“将商继续除以2,直到商为0……”
现在商是3,还不是0,所以继续除以2。
那就: 3 ÷ 2, 得到商是1,余数是1。
“将商继续除以2,直到商为0……”
现在商是1,还不是0,所以继续除以2。
那就: 1 ÷ 2, 得到商是0,余数是1 (拿笔纸算一下,1÷2是不是商0余1!)
“将商继续除以2,直到商为0……最后将所有余数倒序排列”
好极!现在商已经是0。
我们三次计算依次得到余数分别是:0、1、1,将所有余数倒序排列,那就是:110了!
6转换成二进制,结果是110。
把上面的一段改成用表格来表示,则为:
被除数
6
3
1
计算过程 商
6/2
3/2
1/2
3
1
0
余数
0
1
1
(在计算机中,÷用 / 来表示)
如果是在考试时,我们要画这样表还是有点费时间,所更常见的换算过程是使用下图的
连除:
(图:1)
请大家对照图,表,及文字说明,并且自已拿笔计算一遍如何将6转换为二进制数。
说了半天,我们的转换结果对吗?二进制数110是6吗?你已经学会如何将二进制数转
换成10进制数了,所以请现在就计算一下110换成10进制是否就是6。
6.3.2 10进制数转换为8、16进制数
非常开心,10进制数转换成8进制的方法,和转换为2进制的方法类似,惟一变化:除
数由2变成8。
来看一个例子,如何将十进制数120转换成八进制数。
用表格表示:
被除数
120
15
1
计算过程 商
120/8
15/8
1/8
15
1
0
余数
0
7
1
120转换为8进制,结果为:170。
非常非常开心,10进制数转换成16进制的方法,和转换为2进制的方法类似,惟一变
化:除数由2变成16。
同样是120,转换成16进制则为:
被除数
120
7
计算过程 商
120/16
7/16
7
0
余数
8
7
120转换为16进制,结果为:78。
请拿笔纸,采用(图:1)的形式,演算上面两个表的过程。
6.4 二、十六进制数互相转换
二进制和十六进制的互相转换比较重要。不过这二者的转换却不用计算,每个C,C++
程序员都能做到看见二进制数,直接就能转换为十六进制数,反之亦然。
我们也一样,只要学完这一小节,就能做到。
首先我们来看一个二进制数:1111,它是多少呢?
你可能还要这样计算:1 * 2 + 1 * 2 + 1 * 2+ 1 * 2 = 1 * 1 + 1 * 2 + 1 * 4 +
1 * 8 = 15。
然而,由于1111才4位,所以我们必须直接记住它每一位的权值,并且是从高位往低
位记,:8、4、2、1。即,最高位的权值为2= 8,然后依次是 2 = 4,=2, 2 = 1。
记住8421,对于任意一个4位的二进制数,我们都可以很快算出它对应的10进制值。
下面列出四位二进制数 xxxx 所有可能的值(中间略过部分)
仅4位的2进制数 快速计算方法 十进制值 十六进值
1111 = 8 + 4 + 2 + 1 = 15 F
1110 = 8 + 4 + 2 + 0 = 14 E
1101 = 8 + 4 + 0 + 1 =
13 D
3 2210
012 3
1100 = 8 + 4 + 0 + 0 =
12 C
1011 = 8 + 4 + 0 + 1 =
11 B
1010 = 8 + 0 + 2 + 0 = 10 A
1001 = 8 + 0 + 0 + 1 = 10 9
....
0001 = 0 + 0 + 0 + 1 = 1 1
0000 = 0 + 0 + 0 + 0 = 0 0
二进制数要转换为十六进制,就是以4位一段,分别转换为十六进制。
如(上行为二制数,下面为对应的十六进制):
1111 1101 , 1010 0101 , 1001 1011
F D , A 5 , 9 B
反过来,当我们看到 FD时,如何迅速将它转换为二进制数呢?
先转换F:
看到F,我们需知道它是15(可能你还不熟悉A~F这五个数),然后15如何用8421
凑呢?应该是8 + 4 + 2 + 1,所以四位全为1 :1111。
接着转换 D:
看到D,知道它是13,13如何用8421凑呢?应该是:8 + 2 + 1,即:1011。
所以,FD转换为二进制数,为: 1111 1011
由于十六进制转换成二进制相当直接,所以,我们需要将一个十进制数转换成2进制数
时,也可以先转换成16进制,然后再转换成2进制。
比如,十进制数 1234转换成二制数,如果要一直除以2,直接得到2进制数,需要计
算较多次数。所以我们可以先除以16,得到16进制数:
被除数
1234
77
4
计算过程 商
1234/16
77/16
4/16
77
4
0
余数
2
13 (D)
4
结果16进制为: 0x4D2
然后我们可直接写出0x4D2的二进制形式: 0100 1011 0010。
其中对映关系为:
0100 -- 4
1011 -- D
0010 -- 2
同样,如果一个二进制数很长,我们需要将它转换成10进制数时,除了前面学过的方
法是,我们还可以先将这个二进制转换成16进制,然后再转换为10进制。
下面举例一个int类型的二进制数:
01101101 11100101 10101111 00011011
我们按四位一组转换为16进制: 6D E5 AF 1B
6.5 原码、反码、补码
结束了各种进制的转换,我们来谈谈另一个话题:原码、反码、补码。
我们已经知道计算机中,所有数据最终都是使用二进制数表达。
我们也已经学会如何将一个10进制数如何转换为二进制数。
不过,我们仍然没有学习一个负数如何用二进制表达。
比如,假设有一 int 类型的数,值为5,那么,我们知道它在计算机中表示为:
00000000 00000000 00000000 00000101
5转换成二制是101,不过int类型的数占用4字节(32位),所以前面填了一堆0。
现在想知道,-5在计算机中如何表示?
在计算机中,负数以其正值的补码形式表达。
什么叫补码呢?这得从原码,反码说起。
原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。
比如 00000000 00000000 00000000 00000101 是 5的 原码。
反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
取反操作指:原为1,得0;原为0,得1。(1变0; 0变1)
比如:将00000000 00000000 00000000 00000101每一位取反,得11111111 11111111
11111111 11111010。
称:11111111 11111111 11111111 11111010 是 00000000 00000000 00000000 00000101
的反码。
反码是相互的,所以也可称:
11111111 11111111 11111111 11111010 和 00000000 00000000 00000000 00000101 互
为反码。
补码:反码加1称为补码。
也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。
比如:00000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111
11111010。
那么,补码为:
11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011
所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011。转换为十六进
制:0xFFFFFFFB。
再举一例,我们来看整数-1在计算机中如何表示。
假设这也是一个int类型,那么:
1、先取1的原码:00000000 00000000 00000000 00000001
2、得反码: 11111111 11111111 11111111 11111110
3、得补码: 11111111 11111111 11111111 11111111
可见,-1在计算机里用二进制表达就是全1。16进制为:0xFFFFFF。
一切都是纸上说的……说-1在计算机里表达为0xFFFFFF,我能不能亲眼看一看呢?当
然可以。利用C++ Builder的调试功能,我们可以看到每个变量的16进制值。
6.6 通过调试查看变量的值
下面我们来动手完成一个小小的实验,通过调试,观察变量的值。
我们在代码中声明两个int 变量,并分别初始化为5和-5。然后我们通过CB提供的
调试手段,可以查看到程序运行时,这两个变量的十进制值和十六进制值。
首先新建一个控制台工程。加入以下黑体部分(就一行):
//-------------------------------------------------------------------------
--
#pragma hdrstop
//-------------------------------------------------------------------------
--
#pragma argsused
int main(int argc, char* argv[])
{
int aaaa = 5, bbbbb = -5;
return 0;
}
//-------------------------------------------------------------------------
--
没有我们熟悉的的那一行:
getchar();
所以,如果全速运行这个程序,将只是DOS窗口一闪而过。不过今天我们将通过设置
断点,来使用程序在我们需要的地儿停下来。
设置断点:最常用的调试方法之一,使用程序在运行时,暂停在某一代码位置,
在CB里,设置断点的方法是在某一行代码上按F5或在行首栏内单击鼠标。
如下图:
在上图中,我们在return 0;这一行上设置断点。断点所在行将被CB以红色显示。
接着,运行程序(F9),程序将在断点处停下来。
(请注意两张图的不同,前面的图是运行之前,后面这张是运行中,左边的箭头表示运
行运行到哪一行)
当程序停在断点的时,我们可以观察当前代码片段内,可见的变量。观察变量的方法很
多种,这里我们学习使用Debug Inspector (调试期检视),来全面观察一个变量。
以下是调出观察某一变量的 Debug Inspector 窗口的方法:
先确保代码窗口是活动窗口。(用鼠标点一下代码窗口)
按下Ctrl键,然后将鼠标挪到变量 aaaa 上面,你会发现代码中的aaaa变蓝,并且出
现下划线,效果如网页中的超链接,而鼠标也变成了小手状:
点击鼠标,将出现变量aaaa的检视窗口:
(笔者使用的操作系统为WindowsXP,窗口的外观与Win9X有所不同)
从该窗口,我可以看到:
aaaa :变量名
int :变量的数据类型
0012FF88:变量的内存地址,请参看
5.2 变量与内存地址
;地址总是使用十六进制
表达
5 : 这是变量的值,即aaaa = 5;
0x00000005 :同样是变量的值,但采用16进制表示。因为是int类型,所以占用4字
节。
首先先关闭前面的用于观察变量aaaa的Debug Inspector窗口。
现在,我们用同样的方法来观察变量bbbb,它的值为-5,负数在计算机中使用补码表示。
正如我们所想,-5的补码为:0xFFFFFFFB。
再按一次F9,程序将从断点继续运行,然后结束。
6.7 本章小结
很难学的一章?
来看看我们主要学了什么:
1)我们学会了如何将二、八、十六进制数转换为十进制数。
三种转换方法是一样的,都是使用乘法。
2)我们学会了如何将十进制数转换为二、八、十六进制数。
方法也都一样,采用除法。
3)我们学会了如何快速的地互换二进制数和十六进制数。
要诀就在于对二进制数按四位一组地转换成十六进制数。
在学习十六进制数后,我们会在很多地方采用十六进制数来替代二进制数。
4)我们学习了原码、反码、补码。
把原码的0变1,1变0,就得到反码。要得到补码,则先得反码,然后加1。
以前我们只知道正整数在计算机里是如何表达,现在我们还知道负数在计算机里使用其
绝对值的补码表达。
比如,-5在计算机中如何表达?回答是:5的补码。
5)最后我们在上机实验中,这会了如何设置断点,如何调出Debug Inspector窗口观察
变量。
以后我们会学到更多的调试方法。
版权声明:本文标题:十进制、二进制、八进制、十六进制之间的换算规律资料 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/p/1734916075a1608719.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论