二进制、十进制、十六进制换算
发布日期:2021-07-01 04:36:39 浏览次数:2 分类:技术文章

本文共 2656 字,大约阅读时间需要 8 分钟。

1 十进制数据

       在讲解二进制数据之前,我们先来看看我们最常用的十进制数据。

       从小学读书起,我们就开始学习数学,最简单的加法有:

5 + 3 = 8;

5 + 5 = 10;

10 + 16 = 26;

       看到这样的加法算术很简单,它只有一个规则:

(1) 个位数与个位数相加,满10进1;

(2) 十位数与十位数相加,满10进1;

(3) 百位数与百位数相加,满10进1;

...

       以此类推,这种规则表示的数,我们称为:十进制数;

       表示十进制数的元素就有:

0,1,2,3,4,5,6,7,8,9

这样的10个数值;

       所以,从我们最常见的算术开始,我们了解了十进制数。它的规则就是:满10进1;那么,根据这个规则,我们可以定义N进制数,它的规则就是:

(1) 表示N进制数的元素有N个符号;

(2) 满N进1;

2 二进制数据

       通过上一节的讲解,我们知道二进制就是由0和1组成的数字,它表示电子设备的打开和关闭状态。计算机中存储的任何数据都是二进制数据。例如3这个数值,在计算机中都表示成0011这样的二进制数据。

       根据上面提到N进制数规则,我们定义二进制数的规则是:

(1) 表示二进制数的元素有 2 个符号,就是0和1这两个数值;

(2) 二进制数的表示是满2进1;

       知道了二进制数据的表示方法,那么,我们试着把11这个数值的二进制数据写出来。

       把十进制数据转换成二进制数据,使用的方法是:除2取余法,计算过程如下:

11/2 = 5 余 1

5/2 = 2 余 1

2/2 = 1 余 0

1/2 = 0 余 1

除到商为0为止;

       然后,从最末尾的余数开始网上取,得到1011这个二进制数据。所以,十进制11这个数值的二进制数据生就1011。如果把11这个数值存放到1个字节的变量中,那么,这数值在1个字节的内存中表示为0000 1011,因为1个字节是8位,上面我们求出1011二进制数据占据了4位,那么,剩下的高4位没有数据填充,所以,填充0值。

       所以,我们可以总结十进制转二进制的方法:

(1) 十进制数除2取余;

(2) 余数从下到上取;

(3) 高位补零;

       现在我们试着把二进制转换为十进制。在转换之前,我们先看看十进制表示的一个例子。例如189这样的一个数值,在数值序列中,从右边开始算起,从0开始累积,就有:9在第0位,8在第1位,1在第2位,那么,就可以表示为:

1*10^2 + 8*10^1 + 9*10^0

       那么,是十进制表示,所以,基数为10,例如第2未,就有10^2 表示10的二次方,就是10*10,这就是第2位的权重值;注意:在数学计算中,任何数的0次方,都等于1。所以有:

1*10^2 + 8*10^1 + 9*10^0

= 1*100 + 8*10 + 9*1

= 100 + 80 + 9

= 189

       所以,我们可以总结N进制数值的表示算法:

(1) 每个位置上的数值,与权重值相乘,然后求和;

(2) 权重值是N^x,表示N的x次方,x是数值在数值序列上的位置;位置从右边开始算,从0开始;

       同理,我们就把1011这个二进制转换为十进制,也是使用相同的算法。

       把1011这个数值序列解开,从右边开始计算,第0位是1,第1位是1,第2位是0,第3位是1;那么是二进制表示,所以,基数为2,例如第3位,就有2^3的权重,就有:

1*2^3 + 0*2^2 + 1*2^1 + 1*2^0

=8 + 0 + 2 + 1

=11

       所以,我们把11这个十进制转换成了1011二进制数据,再把二进制数据转换为十进制数据。

       再多做一个例子,把18 这个数值转换为二进制表示,有:

18/2 = 9 余 0

9/2 = 4 余 1

4/2 = 2 余 0

2/2 = 1 余 0

1/2 = 0 余 1

       然后,从下往上去余数,得到10010二进制数据。然后,10010二进制转换为十进制数据,有:

1*2^4 + 0*2^3 + 0*2^2 + 1*2^1 + 0*2^0

= 16 + 0 + 0 + 2 + 0

= 18

       通过这些例子的分析,我们讲解了二进制的表示形式和二进制与十进制数值间的相互转换。

3 十六进制数据

       在介绍十进制数的时候,我们已经定义了N进制数,它的规则就是:

(1) 表示N进制数的元素有N个符号;

(2) 满N进1;

       那么,十六进制数就是有16个符号表示,如下:

0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F

       其中A表示10数值,B表示11数值,C表示12数值,D表示13数值,E表示14数值,F表示15数值。

       在学习二进制数据的时候,我们知道,把一个十进制数据转换N进制数据,采样除N取余法。所以,把一个十进制数据转换为十六进制,就是采样除16取余法。例如,把十进制数18这个数值,转换为16进制,有如下的计算:

18/16 = 1 余 2

1/16 = 0余1

       然后,从下往上取余数,得到12这样的十六进制数。但是,我们有些疑惑,当我们看到12这个数值的时候,如果不表明是十六进制,我们可能会认为是十进制数据。

       所以,在计算机系统中,我们定义十六进制数,使用0x前缀表示。所以,上面计算出来的十六进制数据就可以表示为0x12。当我们看到一个数值,如果是以0x开头,就表示这个数据是十六进制数据。

       那么,我们把0x12十六进制数,转换为十进制数,算法与二进制转换为十进制数一样。对于0x12数值序列,第0位是2,第1位是1,所以有:

1*16^1 + 2*16^0

= 16 + 2

= 18

       此时,就可以把十六进制0x12数值对应的十进制计算出来了。我们再计算一个例子,计算十进制是168的数值,转换为十六进制,有:

169/16 = 10 余 9

10/16 = 0 余 10

       其中,10数值使用A表示,所以,得到的十六进制数是0xA9。注意,对于10~15的数值,在十六进制中,使用A~F进行表示。例如十进制15这个数值,使用十六进制表示,就是0xF。

       现在,我们把0xA9这个十六进制转换为十进制,计算方式如下:

A*16^1 + 9*16^0

= 10 * 16 + 9 * 1

= 160 + 9

= 169

       注意,在计算的时候,十六进制的A字符表示十进制的10这个数值。

更多的交流可以加QQ:1523520001,微信:13926572996,备注:linux编程;

学习、分享更多的linux C/C++ 编程知识。

转载地址:https://mylinux.blog.csdn.net/article/details/89203357 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:有符号和无符号数分析
下一篇:内存中数据存储的格式

发表评论

最新留言

很好
[***.229.124.182]2024年04月12日 00时45分17秒