进制原码之间的转换技巧Word格式.docx

上传人:b****6 文档编号:21330383 上传时间:2023-01-29 格式:DOCX 页数:9 大小:34.93KB
下载 相关 举报
进制原码之间的转换技巧Word格式.docx_第1页
第1页 / 共9页
进制原码之间的转换技巧Word格式.docx_第2页
第2页 / 共9页
进制原码之间的转换技巧Word格式.docx_第3页
第3页 / 共9页
进制原码之间的转换技巧Word格式.docx_第4页
第4页 / 共9页
进制原码之间的转换技巧Word格式.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

进制原码之间的转换技巧Word格式.docx

《进制原码之间的转换技巧Word格式.docx》由会员分享,可在线阅读,更多相关《进制原码之间的转换技巧Word格式.docx(9页珍藏版)》请在冰豆网上搜索。

进制原码之间的转换技巧Word格式.docx

例子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]因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1