进制原码之间的转换技巧Word格式.docx
- 文档编号:21330383
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:9
- 大小:34.93KB
进制原码之间的转换技巧Word格式.docx
《进制原码之间的转换技巧Word格式.docx》由会员分享,可在线阅读,更多相关《进制原码之间的转换技巧Word格式.docx(9页珍藏版)》请在冰豆网上搜索。
例子1:
将二进制数(10010)2转化成八进制数。
(10010)2=(010010)2=(22)8=(22)8
例子2:
将二进制数(0.1010)2转化为八进制数。
(0.10101)2=(0.101010)2=(0.52)8=(0.52)8
诀窍:
因为每三位二进制数对应一位八进制数,所以,以小数点为界,整数位则将二进制数从右向左每3位一隔开,不足3位的在左边用0填补即可;
小数位则将二进制数从左向右每3位一隔开,不足3位的在右边用0填补即可。
2.二进制(Binary)——>
十进制(Decimal)
将二进制数(10010)2转化成十进制数。
(10010)2=(1x24+0x23+0x22+1x21+0x20)10=(16+0+0+2+0)10=(18)10
将二进制数(0.10101)2转化为十进制数。
(0.10101)2=(0+1x2-1+0x2-2+1x2-3+0x2-4+1x2-5)10=(0+0.5+0.25+0.125+0.0625+0.03125)10=(0.96875)10
以小数点为界,整数位从最后一位(从右向左)开始算,依次列为第0、1、2、3………n,然后将第n位的数(0或1)乘以2的n-1次方,然后相加即可得到整数位的十进制数;
小数位则从左向右开始算,依次列为第1、2、3……..n,然后将第n位的数(0或1)乘以2的-n次方,然后相加即可得到小数位的十进制数(按权相加法)。
3.二进制(Binary)——>
十六进制(Hex)
将二进制数(10010)2转化成十六进制数。
(10010)2=(00010010)2=(12)16=(12)16
将二进制数(0.1010)2转化为十六进制数。
(0.10101)2=(0.10101000)2=(0.A8)16=(0.A8)16
因为每四位二进制数对应一位十六进制数,所以,以小数点为界,整数位则将二进制数从右向左每4位一隔开,不足4位的在左边用0填补即可;
小数位则将二进制数从左向右每4位一隔开,不足4位的在右边用0填补即可。
(10010)2=(22)8=(18)10=(12)16
(0.10101)2=(0.52)8=(0.96875)10=(0.A8)16
四、八进制转化成其他进制
1.八进制(Octal)——>
二进制(Binary)
将八进制数(751)8转换成二进制数。
(751)8=(751)8=(111101001)2=(111101001)2
将八进制数(0.16)8转换成二进制数。
(0.16)8=(0.16)8=(0.001110)2=(0.00111)2
八进制转换成二进制与二进制转换成八进制相反。
2.八进制(Octal)——>
将八进制数(751)8转换成十进制数。
(751)8=(7x82+5x81+1x80)10=(448+40+1)10=(489)10
将八进制数(0.16)8转换成十进制数。
(0.16)8=(0+1x8-1+6x8-2)10=(0+0.125+0.09375)10=(0.21875)10
方法同二进制转换成十进制。
以小数点为界,整数位从最后一位(从右向左)开始算,依次列为第0、1、2、3………n,然后将第n位的数(0-7)乘以8的n-1次方,然后相加即可得到整数位的十进制数;
小数位则从左向右开始算,依次列为第1、2、3……..n,然后将第n位的数(0-7)乘以8的-n次方,然后相加即可得到小数位的十进制数(按权相加法)。
3.八进制(Octal)——>
将八进制数(751)8转换成十六进制数。
(751)8=(111101001)2=(000111101001)2=(1E9)16=(1E9)16
将八进制数(0.16)8转换成十六进制数。
(0.16)8=(0.00111)2=(0.00111000)2=(0.38)16
八进制直接转换成十六进制比较费力,因此,最好先将八进制转换成二进制,然后再转换成十六进制。
(751)8=(111101001)2=(489)10=(1E9)16
(0.16)8=(0.00111)2=(0.21875)10=(0.38)16
五、十进制转化成其他进制
1.十进制(Decimal)——>
将十进制数(93)10转换成二进制数。
93/2=46……….1
46/2=23……….0
23/2=11……….1
11/2=5…………1
5/2=2…………...1
2/2=1……………0
(93)10=(1011101)2
将十进制数(0.3125)10转换成二进制数。
0.3125x2=0.625
0.625x2=1.25
0.25x2=0.5
0.5x2=1.0
(0.3125)10=(0.0101)2
以小数点为界,整数部分除以2,然后取每次得到的商和余数,用商继续和2相除,直到商小于2。
然后把第一次得到的余数作为二进制的个位,第二次得到的余数作为二进制的十位,依次类推,最后一次得到的小于2的商作为二进制的最高位,这样由商+余数组成的数字就是转换后二进制的值(整数部分用除2取余法);
小数部分则先乘2,然后获得运算结果的整数部分,将结果中的小数部分再次乘2,直到小数部分为零。
然后把第一次得到的整数部分作为二进制小数的最高位,后续的整数部分依次作为低位,这样由各整数部分组成的数字就是转化后二进制小数的值(小数部分用乘2取整法)。
需要说明的是,有些十进制小数无法准确的用二进制进行表达,所以转换时符合一定的精度即可,这也是为什么计算机的浮点数运算不准确的原因。
2.十进制(Decimal)——>
将十进制数(93)10转换成八进制数。
93/8=11………….5
11/8=1……………3
(93)10=(135)8
例子2:
将十进制数(0.3125)10转换成八进制数。
0.3125x8=2.5
0.5x8=4.0
(0.3125)10=(0.24)8
方法同十进制转化成二进制。
以小数点为界,整数部分除以8,然后取每次得到的商和余数,用商继续和8相除,直到商小于8。
然后把第一次得到的余数作为八进制的个位,第二次得到的余数作为八进制的十位,依次类推,最后一次得到的小于8的商作为八进制的最高位,这样由商+余数组成的数字就是转换后八进制的值(整数部分用除8取余法);
小数部分则先乘8,然后获得运算结果的整数部分,将结果中的小数部分再次乘8,直到小数部分为零。
然后把第一次得到的整数部分作为八进制小数的最高位,后续的整数部分依次作为低位,这样由各整数部分组成的数字就是转化后八进制小数的值(小数部分用乘8取整法)。
3.十进制(Decimal)——>
将十进制数(93)10转换成十六进制数。
93/16=5……..13(D)
(93)10=(5D)16
将十进制数(0.3125)10转换成十六进制数。
0.3125x16=5.0
(0.3125)10=(0.5)16
以小数点为界,整数部分除以16,然后取每次得到的商和余数,用商继续和16相除,直到商小于16。
然后把第一次得到的余数作为十六进制的个位,第二次得到的余数作为十六进制的十位,依次类推,最后一次得到的小于16的商作为十六进制的最高位,这样由商+余数组成的数字就是转换后十六进制的值(整数部分用除16取余法);
小数部分则先乘16,然后获得运算结果的整数部分,将结果中的小数部分再次乘16,直到小数部分为零。
然后把第一次得到的整数部分作为十六进制小数的最高位,后续的整数部分依次作为低位,这样由各整数部分组成的数字就是转化后十六进制小数的值(小数部分用乘16取整法)。
(93)10=(1011101)2=(135)8=(5D)16
(0.3125)10=(0.0101)2=(0.24)8=(0.5)16
六、十六进制转换成其他进制
1.十六进制(Hex)——>
将十六进制数(A7)16转换成二进制数。
(A7)16=(A7)16=(10100111)2=(10100111)2
将十六进制数(0.D4)16转换成二进制数。
(0.D4)16=(0.D4)16=(0.11010100)2=(0.110101)2
十六进制转换成二进制与二进制转换成十六进制相反。
2.十六进制(Hex)——>
将十六进制数(A7)16转换成八进制数。
(A7)16=(10100111)2=(010100111)8=(247)8
将十六进制数(0.D4)16转换成八进制数。
(0.D4)16=(0.110101)2=(0.110101)8=(0.65)8
十六进制直接转换成八进制比较费力,因此,最好先将十六进制转换成二进制,然后再转换成八进制。
3.十六进制(Hex)——>
将十六进制数(A7)16转换成十进制数。
(A7)16=(10x161+7x160)10=(160+7)10=(167)10
将十六进制数(0.D4)16转换成十进制数。
(0.D4)16=(0+13x16-1+4x16-2)10=(0+0.8125+0.015625)10=(0.828125)10
以小数点为界,整数位从最后一位(从右向左)开始算,依次列为第0、1、2、3………n,然后将第n位的数(0-9,A-F)乘以16的n-1次方,然后相加即可得到整数位的十进制数;
小数位则从左向右开始算,依次列为第1、2、3……..n,然后将第n位的数(0-9,A-F)乘以16的-n次方,然后相加即可得到小数位的十进制数(按权相加法)。
(A7)16=(10100111)2=(247)8=(167)10
(0.D4)16=(0.110101)2=(0.65)8=(0.828125)10
七、总结
1.其他进制转十进制:
将二进制数、八进制数、十六进制数的各位数字分别乘以各自基数的(N-1)次方,其相加之和便是相应的十进制数,这是按权相加法。
2.十进制转其他进制:
整数部分用除基取余法,小数部分用乘基取整法,然后将整数与小数部分拼接成一个数作为转换的最后结果。
3.二进制转八进制:
从小数点位置开始,整数部分向左,小数部分向右,每三位二进制为一组用一位八进制的数字来表示,不足三位的用0补足。
4.八进制转二进制:
与二进制转八进制相反。
5.二进制转十六进制:
从小数点位置开始,整数部分向左,小数部分向右,每四位二进制为一组用一位十六进制的数字来表示,不足四位的用0补足。
6.十六进制转二进制:
与二进制转十六进制相反。
7.八进制转十六进制:
通常将八进制转换成二进制,然后通过二进制再转换成十六进制。
8.十六进制转八进制:
通常将十六进制转换成二进制,然后通过二进制再转换成八进制。
一.机器数和真值
在学习原码,反码和补码之前,需要先了解机器数和真值的概念.
1、机器数
一个数在计算机中的二进制表示形式,
叫做这个数的机器数。
机器数是带符号的,在计算机用一个数的最高位存放符号,正数为0,负数为1.
比如,十进制中的数+3,计算机字长为8位,转换成二进制就是00000011。
如果是-3,就是10000011。
那么,这里的00000011和10000011就是机器数。
2、真值
因为第一位是符号位,所以机器数的形式值就不等于真正的数值。
例如上面的有符号数10000011,其最高位1代表负,其真正数值是-3而不是形式值131(10000011转换成十进制等于131)。
所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。
例:
00000001的真值=+0000001=+1,10000001的真值=–0000001=–1
二.原码,反码,补码的基础概念和计算方法.
在探求为何机器要使用补码之前,让我们先了解原码,反码和补码的概念.对于一个数,计算机要使用一定的编码方式进行存储.原码,反码,补码是机器存储一个具体数字的编码方式.
1.原码
原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值.比如如果是8位二进制:
[+1]原=00000001
[-1]原=10000001
第一位是符号位.因为第一位是符号位,所以8位二进制数的取值范围就是:
[11111111,01111111]
即
[-127,127]
原码是人脑最容易理解和计算的表示方式.
2.反码
反码的表示方法是:
正数的反码是其本身
负数的反码是在其原码的基础上,符号位不变,其余各个位取反.
[+1]=[00000001]原=[00000001]反
[-1]=[10000001]原=[11111110]反
可见如果一个反码表示的是负数,人脑无法直观的看出来它的数值.通常要将其转换成原码再计算.
3.补码
补码的表示方法是:
正数的补码就是其本身
负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1.(即在反码的基础上+1)
[+1]=[00000001]原=[00000001]反=[00000001]补
[-1]=[10000001]原=[11111110]反=[11111111]补
对于负数,补码表示方式也是人脑无法直观看出其数值的.通常也需要转换成原码在计算其数值.
三.为何要使用原码,反码和补码
在开始深入学习前,我的学习建议是先"
死记硬背"
上面的原码,反码和补码的表示方式以及计算方法.
现在我们知道了计算机可以有三种编码方式表示一个数.对于正数因为三种编码方式的结果都相同:
所以不需要过多解释.但是对于负数:
可见原码,反码和补码是完全不同的.既然原码才是被人脑直接识别并用于计算表示方式,为何还会有反码和补码呢?
首先,因为人脑可以知道第一位是符号位,在计算的时候我们会根据符号位,选择对真值区域的加减.(真值的概念在本文最开头).但是对于计算机,加减乘数已经是最基础的运算,要设计的尽量简单.计算机辨别"
符号位"
显然会让计算机的基础电路设计变得十分复杂!
于是人们想出了将符号位也参与运算的方法.我们知道,根据运算法则减去一个正数等于加上一个负数,即:
1-1=1+(-1)=0,所以机器可以只有加法而没有减法,这样计算机运算的设计就更简单了.
于是人们开始探索将符号位参与运算,并且只保留加法的方法.首先来看原码:
计算十进制的表达式:
1-1=0
1-1=1+(-1)=[00000001]原+[10000001]原=[10000010]原=-2
如果用原码表示,让符号位也参与计算,显然对于减法来说,结果是不正确的.这也就是为何计算机内部不使用原码表示一个数.
为了解决原码做减法的问题,出现了反码:
1-1=1+(-1)=[00000001]原+[10000001]原=[00000001]反+[11111110]反=[11111111]反=[10000000]原=-0
发现用反码计算减法,结果的真值部分是正确的.而唯一的问题其实就出现在"
0"
这个特殊的数值上.虽然人们理解上+0和-0是一样的,但是0带符号是没有任何意义的.而且会有[00000000]原和[10000000]原两个编码表示0.
于是补码的出现,解决了0的符号以及两个编码的问题:
1-1=1+(-1)=[00000001]原+[10000001]原=[00000001]补+[11111111]补=[00000000]补=[00000000]原
这样0用[00000000]表示,而以前出现问题的-0则不存在了.而且可以用[10000000]表示-128:
(-1)+(-127)=[10000001]原+[11111111]原=[11111111]补+[10000001]补=[10000000]补
-1-127的结果应该是-128,在用补码运算的结果中,[10000000]补就是-128.但是注意因为实际上是使用以前的-0的补码来表示-128,所以-128并没有原码和反码表示.(对-128的补码表示[10000000]补算出来的原码是[00000000]原,这是不正确的)
使用补码,不仅仅修复了0的符号以及存在两个编码的问题,而且还能够多表示一个最低数.这就是为什么8位二进制,使用原码或反码表示的范围为[-127,+127],而使用补码表示的范围为[-128,127].
因为机器使用补码,所以对于编程中常用到的32位int类型,可以表示范围是:
[-231,231-1]因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 进制原码 之间 转换 技巧
![提示](https://static.bdocx.com/images/bang_tan.gif)