【计算机组成原理】你敢相信5.8+0.9=6.1这个等式居然成立!!!详细解读进制数之间的相互转换

news2024/11/17 5:50:09

进位计数制及其相互转换

  • 导读
  • 一、进位计数法
    • 1.1 基数
    • 1.2 位权
  • 二、不同进制数之间的相互转化
    • 2.1 转化方法
    • 2.2 任意进制转化成十进制
    • 2.3 十进制转化成任意进制
    • 2.4 二进制、八进制以及十六进制之间的相互转换
      • 2.4.1 二进制与八进制以及十六进制之间的关系
      • 2.4.2 二进制数与八进制数之间的相互转换
      • 2.4.3 八进制与十六进制的相互转换
  • 三、真值和机器数
  • 结语

封面

导读

大家好,很高兴又和大家见面啦!!!

从今天开始,我们将一起进入第二章内容的学习。经过前面的学习,现在我们已经对计算机系统有了一个初步的认识和了解。在计算机的发展史中我们有提到,计算机的出现一开始是为了用于军事上来计算导弹的轨道,因此计算机的计算能力才是计算机发明的初衷。

在冯·诺依曼的机器中,计算机的运算功能被整合到了一块小的零部件——运算器。那现在问题来了,计算机中的这个零部件,它究竟是如何完成复杂的计算任务的呢?

在本章的内容中,我们将会对数据在计算机中的存储与运算方法进行一个深入的探讨。本章的内容我们将会将其分为3个部分进行探讨:

  1. 数制与编码
  2. 运算方法和运算电路
  3. 浮点数的表示与运算

在今天的内容中,我们将会介绍数制与编码中的第一部分——进位计数制及其相互转换。通过今天的内容,我们将会对不同的进制数有一个更加清晰的认识,接下来我们就来开启今天的内容吧!!!

一、进位计数法

在计算机系统内部,所有的信息都是用二进制进行编码的,这样做的原因有以下几点:

  1. 二进制只有两种状态,使用有两个稳定状态的物理器件就可以表示二进制数的每一位,制造成本比较低,例如用高低电平或电荷的正负极性都可以很方便的表示0和1;
  2. 二进制位的1和0正好与逻辑值“真”和“假”相对应,为计算机实现逻辑运算和程序中的逻辑判断提供了便利条件;
  3. 二进制的编码和运算规则都很简单,通过逻辑门电路能方便地实现算术运算。

在常用的进位计数法中有二进制数、八进制数、十进制数、十六进制数等。其中十进制数是日常生活中最常使用的,而计算机中通常使用二进制数、八进制数和十六进制数。

1.1 基数

在进位计数法中,每个数位所用到的不同数码的个数称为基数 r r r 进制数就有r个数码,其基数为 r r r ,常见的不同进制数及其基数分别为:

  • 二进制数有 0 、 1 0、1 01两个数码,因此二进制的基数为2
  • 八进制数有 0 ~ 7 0~7 07八个数码,因此八进制的基数为8
  • 十进制数有 0 ~ 9 0~9 09十个数码,因此十进制的基数为10
  • 十六进制数有 0 ~ 9 , a ~ f (不区分大小写) 0~9,a~f(不区分大小写) 09af(不区分大小写)十六个数码,因此十六进制的基数为16

对于 r r r 进制数而言,其数值满足每个数位计满 r r r 则进1,如:

  • 二进制数满足满二进一,如 101 + 1 = 110 101 + 1 = 110 101+1=110
  • 八进制数满足满八进一,如 107 + 1 = 110 107 + 1 = 110 107+1=110
  • 十进制数满足满十进一,如 109 + 1 = 110 109 + 1 = 110 109+1=110
  • 十六进制数满足满十六进一,如 10 F + 1 = 110 10F + 1 = 110 10F+1=110

1.2 位权

对于110这个数,很显然,不同位上的1所对应的数值是不相同的。每个数码所表示的数值等于该数码本身乘以一个与它所在位数有关的常数,这个常数称为位权。一个数的数值大小就是它的各位数码按权相加。

如一个 r r r 进制数 K n K n − 1 … K 0 K − 1 … K − m K_nK_{n-1}…K_0K_{-1}…K_{-m} KnKn1K0K1Km的数值就可以表示为:
K n ⋅ r n + K n − 1 ⋅ r n − 1 + … + K 0 ⋅ r 0 + K − 1 ⋅ r − 1 + … + K − m ⋅ r − m K_n·r^n+K_{n-1}·r^{n-1}+…+K_0·r^0+K_{-1}·r^{-1}+…+K_{-m}·r^{-m} Knrn+Kn1rn1++K0r0+K1r1++Kmrm

式中的 r r r 为基数, r i r^i ri是第 i i i 个数的位权(整数位最低位规定为第0位), K i K_i Ki 的取值可以是 0 ~ ( i − 1 ) 0~(i-1) 0(i1) r r r 个数码中的任意一个。

  • 二进制数中,其基数为2,任意数位的位权为 2 i 2^i 2i ,其中 i i i 为所在的位数。如 110.11 这个二进制数中:
    • 其每位数位对应的位权分别是: 2 2 、 2 1 、 2 0 、 2 − 1 、 2 − 2 2^2、2^1、2^0、2^{-1}、2^{-2} 2221202122
    • 其所对应的数值则是: 1 × 2 2 + 1 × 2 1 + 0 × 2 0 + 1 × 2 − 1 + 1 × 2 − 2 = 6.525 1 × 2^2 + 1 × 2^1+ 0 × 2^0 + 1 × 2^{-1}+ 1 × 2^{-2} = 6.525 1×22+1×21+0×20+1×21+1×22=6.525
  • 八进制数中,其基数为8,任意数位的位权为 8 i 8^i 8i ,其中 i i i 为所在的位数。如 110.11 这个八进制数中:
    • 其每位数位对应的位权分别是: 8 2 、 8 1 、 8 0 、 8 − 1 、 8 − 2 8^2、8^1、8^0、8^{-1}、8^{-2} 8281808182
    • 其所对应的数值则是: 1 × 8 2 + 1 × 8 1 + 0 × 8 0 + 1 × 8 − 1 + 1 × 8 − 2 = 72.1875 1 × 8^2 + 1 × 8^1+ 0 × 8^0 + 1 × 8^{-1}+ 1 × 8^{-2} = 72.1875 1×82+1×81+0×80+1×81+1×82=72.1875
  • 十进制数中,其基数为10,任意数位的位权为 1 0 i 10^i 10i ,其中 i i i 为所在的位数。如 110.11 这个十进制数中:
    • 其每位数位对应的位权分别是: 1 0 2 、 1 0 1 、 1 0 0 、 1 0 − 1 、 1 0 − 2 10^2、10^1、10^0、10^{-1}、10^{-2} 102101100101102
    • 其所对应的数值则是: 1 × 1 0 2 + 1 × 1 0 1 + 0 × 1 0 0 + 1 × 1 0 − 1 + 1 × 1 0 − 2 = 110.11 1 × 10^2 + 1 × 10^1+ 0 × 10^0 + 1 × 10^{-1}+ 1 × 10^{-2} = 110.11 1×102+1×101+0×100+1×101+1×102=110.11
  • 十六进制数中,其基数为16,任意数位的位权为 1 6 i 16^i 16i ,其中 i i i 为所在的位数。如 110.11 这个十六进制数中:
    • 其每位数位对应的位权分别是: 1 6 2 、 1 6 1 、 1 6 0 、 1 6 − 1 、 1 6 − 2 16^2、16^1、16^0、16^{-1}、16^{-2} 162161160161162
    • 其所对应的数值则是: 1 × 1 6 2 + 1 × 1 6 1 + 0 × 1 6 0 + 1 × 1 6 − 1 + 1 × 1 6 − 2 = 272.0664 1 × 16^2 + 1 × 16^1+ 0 × 16^0 + 1 × 16^{-1}+ 1 × 16^{-2} = 272.0664 1×162+1×161+0×160+1×161+1×162=272.0664

这里我们需要注意,对于一个 r r r 进制数来说,其整数部分的位权与小数部分的位权分别为:

  • 整数部分的位权从右往左依次为 r i , i = 0 , 1 , 2 , 3 , … , n r^i,i = 0, 1, 2, 3, …,n ri,i=0,1,2,3,n
  • 小数部分的位权从左到右依次为 r i , i = − 1 , − 2 , − 3 , … , − n r^i,i = -1, -2, -3, …,-n ri,i=1,2,3,n

我们将即包含整数部分又包含小数部分的 r r r 进制的数称为 r r r 进制的混合数。也就是说,对于一个 r r r 进制的混合数而言,以小数点为分界点,小数点的左侧即整数部分位权值为基数的正整数幂(从0开始),小数点的右侧即小数部分权值为基数的负整数幂(从-1开始)。

从上面的介绍中我们不难发现,对于同样的一个数,在不同的进制下,它所表示的数值是不相同的。就比如,在十进制下 5.8 + 0.9 = 6.7 5.8 + 0.9 = 6.7 5.8+0.9=6.7 这个等式是成立的,但是在十六进制下 5.8 + 0.9 = 6.1 5.8 + 0.9 = 6.1 5.8+0.9=6.1 这个等式才是成立的,有这样差别的原因就是不同进制下的进一条件不同。

那现在就有一个问题,进制与进制之间可以进行相互转换吗?

答案是可以进行相互转换的。在学习【C语言必学知识点三】数组时,我们有简单介绍过不同进制之间的相互转化的问题,但是当时我们只是介绍了一下整型进制数之间的相互转化。为了帮助大家更好的理解并掌握不同进制之间的相互转化,下面我们就来一起深入探讨一下进制转化的问题;

二、不同进制数之间的相互转化

现在我们主要介绍的是二进制、八进制、十进制以及十六进制之间的相互转换,不过并不代表今天介绍的内容只能用于上述进制之间的转化。接下来的内容,我们应该理解为是以上述的四种进制为例来展示不同进制之间的转化方法;

2.1 转化方法

对于不同进制之间的转化,我们通常会采用以下几种方法:

  • 任意进制转化成十进制:按权展开相加法
  • 十进制转化成任意进制:
    • 整数部分:除基取余法
    • 小数部分:乘基取整法
  • 二进制与八进制和十六进制之间的相互转换:分组转化法

对于上述这些不同的转换方法而言,任意进制与十进制之间的相互转化是我们在进行进制转化时的一种常见方法。如我们要完成二进制转化成十六进制,我们就可以采用以下步骤:

  • 第一步:将二进制转换成十进制
  • 第二步:将十进制转换成十六进制

同理,其它进制之间的相互转换,我们都可以将十进制作为过渡进制来完成相应的转化。

因此对于 r r r 进制转化成 m m m 进制的常用方法为:

  • 第一步:将 r r r 进制转换成十进制
  • 第二步:将十进制转换成 m m m 进制

而对于二进制与八进制二进制与十六进制这种进制与进制之间存在一定关系的特殊进制,我们则可以采用其它的更加便利的转化方法。

下面我们就来看一下对于上述的不同转换方法,我们应该如何来进行使用;

2.2 任意进制转化成十进制

对于 r r r 进制与十进制而言,当我们要进行 r r r 进制转十进制时,我们常使用的是按权展开相加法

所谓的按权展开相加法实际上就是将任意进制的各位数码与它们的权值相乘,再把乘积相加,这样就得到了一个十进制的数,即对于 r r r 进制数 K n K n − 1 … K 0 K − 1 … K − m K_nK_{n-1}…K_0K_{-1}…K_{-m} KnKn1K0K1Km,我们要将其转换成十进制的话,则可通过下列式子来完成转换:
K n ⋅ r n + K n − 1 ⋅ r n − 1 + … + K 0 ⋅ r 0 + K − 1 ⋅ r − 1 + … + K − m ⋅ r − m K_n·r^n+K_{n-1}·r^{n-1}+…+K_0·r^0+K_{-1}·r^{-1}+…+K_{-m}·r^{-m} Knrn+Kn1rn1++K0r0+K1r1++Kmrm

如二进制的混合数110.11我们要将其转化成十进制时,我们就可以通过按权展开相加法来进行转换,如下所示:
( 110.11 ) 2 = 1 × 2 2 + 1 × 2 1 + 0 × 2 0 + 1 × 2 − 1 + 1 × 2 − 2 = ( 6.75 ) 10 (110.11)_2=1×2^2+1×2^1+0×2^0+1×2^{-1}+1×2^{-2}=(6.75)_{10} (110.11)2=1×22+1×21+0×20+1×21+1×22=(6.75)10
在表示不同进制数时,我们可以通过在数的左右两侧加上"()"并在右侧对应进制的下标进行表示,如上式中的 ( 110.11 ) 2 (110.11)_2 (110.11)2表示的就是二进制数 110.11 110.11 110.11 ( 6.75 ) 10 (6.75)_{10} (6.75)10表示的就是十进制数 6.75 6.75 6.75

2.3 十进制转化成任意进制

对于 r r r 进制与十进制而言,当我们要进行十进制转 r r r 进制时,我们则是通过对整数部分与小数部分的不同处理方式来完成转换:

  • 整数部分——除基取余法:整数部分进行除基取余,最先取得的余数为数的最低位,最后取得的余数为数的最高位(即除基取余,先余为低,后余为高),商为0时结束。
  • 小数部分——乘基取整法:小数部分乘基取整,最先取得的整数为数的最高位,最后取得的整数为数的最低位(即乘基取整,先整为高,后整为低),乘积为1.0(或满足精度要求)时结束。

如十进制的混合数6.75我们要将其转化成二进制时,我们就可以分别对整数部分和小数部分进行转换:

  • 整数部分:转化成 r r r 进制则进行除 r r r 取余。
//整数部分——除基取余法
6 / 2 = 3 …… 0——取余数0(低位)
3 / 2 = 1 …… 1——取余数1
1 / 2 = 0 …… 1——取余数1(高位)

整数部分 ( 6 ) 10 (6)_{10} (6)10 对应的二进制数为 ( 110 ) 2 (110)_2 (110)2

  • 小数部分:转化成 r r r 进制则进行乘 r r r 取整
//小数部分——乘基取整法
0.75 × 2 = 1.5——取整数1(高位)
 0.5 × 2 = 1.0——取整数1(低位)

小数部分 ( 0.75 ) 10 (0.75)_{10} (0.75)10 对应的二进制数为 ( 0.11 ) 2 (0.11)_2 (0.11)2

将整数部分与小数部分相加后我们便可以得到 ( 6.75 ) 10 (6.75)_{10} (6.75)10 完整的二进制形式 ( 110.11 ) 2 (110.11)_2 (110.11)2

不过当我们在进行十进制转换成二进制时,我们需要注意的是,在计算机中,小数与整数不一样,整数可以连续表示,但是小数时离散的,所以并不是每一个十进制小数都可以准确地用二进制表示,如0.3,无论经过多少次乘二取整转换都无法得到精确的结果。但任意一个二进制小数都可以用十进制小数表示。

现在我们已经了解了十进制与任意 r r r 进制之间的相互转化,就如前面所说,对于任意 r r r 进制数如果我们要将其转换成 m m m 进制数,我们都可以通过将 r r r 进制转化成十进制,再由十进制转化成 m m m进制的思路来完成进制之间的转化。

不过对于如二进制与八进制以及二进制与十六进制这种进制与进制之间存在某种关系的特殊进制来说,它们之间的转化则可以以其他的方式来完成,下面我们就来探讨一下这三种进制之间的相互转换;

2.4 二进制、八进制以及十六进制之间的相互转换

2.4.1 二进制与八进制以及十六进制之间的关系

在二进制数中,其基数为2,位权为 2 i 2^i 2i,我们不难发现 2 3 = 8 2^3=8 23=8 以及 2 4 = 16 2^4=16 24=16。可能有朋友会好奇,这两个值有什么特殊含义吗?

别着急,我们先接着往下看:

  • 在八进制数中,其基数为8,位权为 8 i 8^i 8i
  • 在十六进制数中,其基数为16,位权为 1 6 i 16^i 16i

大家现在有没有什么发现?在八进制中,其位权可以表示为 ( 2 3 ) i (2^3)^i (23)i ,在十六进制中,其位权可以表示为 ( 2 4 ) i (2^4)^i (24)i。可能现在还是有朋友不太理解这一步转化有何意义,别着急我们继续往下看;

在二进制中,只有0和1两个数码,并且在二进制的整数部分中,位权从右到左依次为:
2 n … … 2 i … … 2 4 2 3 2 2 2 1 2 0 2^n …… 2^i …… 2^4 2^3 2^2 2^1 2^0 2n……2i……2423222120
第一位位权值 2 0 2^0 20 能够表示的数值范围是 0 ~ 1 0~1 01
第二位位权值 2 1 2^1 21 能够表示的数值范围是 0 ~ 3 0~3 03
第三位位权值 2 2 2^2 22 能够表示的数值范围是 0 ~ 7 0~7 07
第四位位权值 2 3 2^3 23 能够表示的数值范围是 0 ~ 15 0~15 015
依次类推
第n位位权值 2 n 2^n 2n 能够表示的数值范围是 0 ~ 2 n − 1 0~2^n-1 02n1;

注意:这里的表示数值的范围是从第一位位权开始到第n位位权为止所能表示的数值的全部范围,而不是说的是单一位权值所能表示的范围;

从表示的数值范围可以看到,当我们将二进制的数码以3个为一组的形式进行划分的话,那么每一组所能够表示的范围都是 0 ~ 7 0~7 07,而这个数值范围正好是八进制数码的数值范围。也就是说,3个二进制数码可以看做是1个八进制的数码;

同理,当我们将二进制的数码以4个为一组的形式进行划分的话,那么每一组所能够表示的范围都是 0 ~ 15 0~15 015,而这个范围正好是十六进制数码的数值范围。到这里可能就有朋友会存在疑惑,十六进制的数码不应该是 0 ~ 9 0~9 09 以及 a ~ f (不区分大小写) a~f(不区分大小写) af(不区分大小写) 这十六个数码吗?咋就跟 0 ~ 15 0~15 015 扯上关系了呢?

这是因为在十六进制中每一个数码所对应的数值大小如下所示:

0	1	2	3	4	5	6	7	8	9	 A	 B	 C	 D	 E	 F
0	1	2	3	4	5	6	7	8	9	10	11	12	13	14	15

也就是说在十六进制数中,对于两位数在表示时采用的是单字符的形式,通过这种方式就能够做到使用16个单字符表示 0 ~ 15 0~15 015 这16个数值。

现在我们已经知道了二进制与八进制以及十六进制之间的关系,那么对于这三种进制,我们应该如何进行相互转化呢?

2.4.2 二进制数与八进制数之间的相互转换

对于一个二进制混合数(即包含整数部分,又包含小数部分),在转换为八进制数时应以小数点为界。

  • 其整数部分,从小数点开始往左数,将一串二进制数分为3位一组,在数的最左边可根据需要加'0'补齐;
  • 对于小数部分,从小数点开始往右数,也将一串二进制数分为3为一组,在数的最右边也可根据需要加'0'补齐。

补0的目的是最终使总的位数为3的整数倍,然后分别用对应的八进制数取代。

从上述的转换方法来看,想要实现二进制转换成八进制,无非就是将二进制的数码进行分组,转八进制就是3个数码为一组,之后再按照分组来将二进制的数转换成对应进制的数码。下面我们用一个实例来进行说明。

将二进制数1111000010.01101分别转换成八进制与十六进制。

整个转换的过程,我们将其分为3步:

  1. 分组:我们从小数点开始,分别向左与向右进行整数部分与小数部分的分组
  2. 补0:当整数部分最高位分组不满足分组要求时在高位进行补0;当小数部分最低位分组不满足分组要求时,在最低位补0;
  3. 换算:通过将各个分组的二进制数换算成其数值大小来获取对应的进制数码

下面我们就来按照步骤一步一步来完成二进制的转换,如下所示:

二进制转八进制
在这个例子中,当我们在进行分组阶段我们发现,左侧最高位进行分组时,只有1个数码,因此我们在最高位上补上了2个0来凑成一组;右侧最低位只有2个数码,因此我们在最低位上补上了1个0 来凑成一组。

在换算阶段,是根据每一组的数码进行换算,因此每一组的最左侧的数码的位权值为 2 0 2^0 20,最右侧的位权值为 2 2 2^2 22,因此我们便通过分组换算后得到了该数值对应的八进制数值:1702.32

既然二进制转八进制是将二进制数码按三个一组进行分组转换,那么,当我们在进行八进制转二进制时,我们则可以将逆转这个过程,即将1个八进制数码转换成3个二进制数码,并且在必要时可以去掉整数最高位或者小数最低位的0。那么如何将1个八进制数码转换成3个二进制数码呢?

这里我们所使用的转化方法有两种:

  • 直接转化法:通过枚举将八进制的 0 ~ 7 0~7 07 所对应的二进制数码一一列举出来,然后进行直接转化:

( 0 ) 8 —— ( 000 ) 2 (0)_8——(000)_2 (0)8——(000)2 ( 1 ) 8 —— ( 001 ) 2 (1)_8——(001)_2 (1)8——(001)2 ( 2 ) 8 —— ( 010 ) 2 (2)_8——(010)_2 (2)8——(010)2 ( 3 ) 8 —— ( 011 ) 2 (3)_8——(011)_2 (3)8——(011)2
( 4 ) 8 —— ( 100 ) 2 (4)_8——(100)_2 (4)8——(100)2 ( 5 ) 8 —— ( 101 ) 2 (5)_8——(101)_2 (5)8——(101)2 ( 6 ) 8 —— ( 110 ) 2 (6)_8——(110)_2 (6)8——(110)2 ( 7 ) 8 —— ( 111 ) 2 (7)_8——(111)_2 (7)8——(111)2

  • 除基取余法:通过对每一个八进制数码进行除基取余,获得的二进制数码不足3位情况下,根据实际需求在其高位进行补0操作,比如我们要将 ( 1702.32 ) 8 (1702.32)_8 (1702.32)8 转化成二进制,我们则需要将每一个字符依次进行除基取余,如下所示:
//八进制转化二进制——分组转化法(除基取余法)
1702.32
//从右到左依次转化
//从小数点右侧第二位开始转化
(2)8>二进制
2 / 2 = 1 …… 0
1 / 2 = 0 …… 1
不足3位,在高位补0,得到(2)8——(010)2
(3)8>二进制
3 / 2 = 1 …… 1
1 / 2 = 0 …… 1
不足3位,在高位补0,得到(3)8——(0112
(2)8>二进制
2 / 2 = 1 …… 0
1 / 2 = 0 …… 1
不足3位,在高位补0,得到(2)8——(010)2
(0)8>(0)2
不足三位,在高位补0 ,得到(0)8——(000)2
(7)8>二进制
7 / 2 = 3 …… 1
3 / 2 = 1 …… 1
1 / 2 = 0 …… 1
满足3位,得到(7)8——(111)2
(1)8>二进制
1 / 2 = 0 …… 1
不足3位,在高位补0,得到(1)……(001)2

当我们完成了逐个转化后,我们就可以将每个数码获得的二进制数码给组合起来,这样我们就得到了 ( 1702.32 ) 8 (1702.32)_8 (1702.32)8 的二进制数码 ( 001111000010.011010 ) 2 (001111000010.011010)_2 (001111000010.011010)2,此时我们可以去掉最高位的0与最低位的0,这样就得到了二进制数码 ( 1111000010.01101 ) 2 (1111000010.01101)_2 (1111000010.01101)2

对于十六进制转化为二进制而言,整体的思路与八进制转二进制是一致的,这里我就不再赘述。

2.4.3 八进制与十六进制的相互转换

八进制与二进制的相互转化比较简单,十六进制与二进制的相互转换也比较简单,但是对于八进制与十六进制而言,它们之间并不存在什么关系,因此转换的思路就是 r r r 进制转 m m m 进制的思路。不过对于八进制与十六进制而言,它们又都与二进制有联系,因此八进制与十六进制的相互转换是有两种方法:

  • 方法一:借助十进制完成转换:先将八进制(十六进制)转换成十进制,再将十进制转换成十六进制(八进制);
  • 方法二:借助二进制完成转换:先将八进制(十六进制)转换成二进制,再将二进制转换成十六进制(八进制);

显然对于八进制与十六进制而言,借助二进制转换的效率会更高一点,因为不管是通过直接转化法还是通过除基取余法,都只需要少量的计算就能完成转换。下面我们以十六进制数 ( 1234.1234 ) 16 (1234.1234)_{16} (1234.1234)16转八进制为例来说明,如下所示:

( 0 ) 16 —— ( 0000 ) 2 (0)_{16}——(0000)_2 (0)16——(0000)2 ( 1 ) 16 —— ( 0001 ) 2 (1)_{16}——(0001)_2 (1)16——(0001)2 ( 2 ) 16 —— ( 0010 ) 2 (2)_{16}——(0010)_2 (2)16——(0010)2 ( 3 ) 16 —— ( 0011 ) 2 (3)_{16}——(0011)_2 (3)16——(0011)2
( 4 ) 16 —— ( 0100 ) 2 (4)_{16}——(0100)_2 (4)16——(0100)2 ( 5 ) 16 —— ( 0101 ) 2 (5)_{16}——(0101)_2 (5)16——(0101)2 ( 6 ) 16 —— ( 0110 ) 2 (6)_{16}——(0110)_2 (6)16——(0110)2 ( 7 ) 16 —— ( 0111 ) 2 (7)_{16}——(0111)_2 (7)16——(0111)2
( 8 ) 16 —— ( 1000 ) 2 (8)_{16}——(1000)_2 (8)16——(1000)2 ( 9 ) 16 —— ( 1001 ) 2 (9)_{16}——(1001)_2 (9)16——(1001)2 ( 10 ) 16 —— ( 1010 ) 2 (10)_{16}——(1010)_2 (10)16——(1010)2 ( 11 ) 16 —— ( 1011 ) 2 (11)_{16}——(1011)_2 (11)16——(1011)2
( 12 ) 16 —— ( 1100 ) 2 (12)_{16}——(1100)_2 (12)16——(1100)2 ( 13 ) 16 —— ( 1101 ) 2 (13)_{16}——(1101)_2 (13)16——(1101)2 ( 14 ) 16 —— ( 1110 ) 2 (14)_{16}——(1110)_2 (14)16——(1110)2 ( 15 ) 16 —— ( 1111 ) 2 (15)_{16}——(1111)_2 (15)16——(1111)2

转化步骤如下所示:

  1. 通过直接转化法,我们能够很快的获取 ( 1234.1234 ) 16 (1234.1234)_{16} (1234.1234)16 所对应的二进制数:
    ( 0001001000110100.0001001000110100 ) 2 (0001 0010 0011 0100.0001 0010 0011 0100)_2 (0001001000110100.0001001000110100)2
  2. 去掉最高位与最低位的0后,便得到了二进制数:
    ( 1001000110100.00010010001101 ) 2 (1 0010 0011 0100.0001 0010 0011 01)_2 (1001000110100.00010010001101)2
  3. 接下来再对该二进制数进行重新分组后我们便获得了
    • 整数部分: ( 001 ) 2 (001)_2 (001)2 ( 001 ) 2 (001)_2 (001)2 ( 000 ) 2 (0 00)_2 (000)2 ( 110 ) 2 (11 0)_2 (110)2 ( 100 ) 2 (100)_2 (100)2.、
    • 小数部分: ( 000 ) 2 (000)_2 (000)2 ( 100 ) 2 (100)_2 (100)2 ( 100 ) 2 (100)_2 (100)2 ( 011 ) 2 (011)_2 (011)2 ( 010 ) 2 (010)_2 (010)2
  4. 通过直接转化我们便得到了其对应的八进制数码:
    • 整数部分: ( 1 ) 8 (1)_8 (1)8 ( 1 ) 8 (1)_8 (1)8 ( 0 ) 8 (0)_8 (0)8 ( 6 ) 8 (6)_8 (6)8 ( 4 ) 8 (4)_8 (4)8.、
    • 小数部分: ( 0 ) 8 (0)_8 (0)8 ( 4 ) 8 (4)_8 (4)8 ( 4 ) 8 (4)_8 (4)8 ( 3 ) 8 (3)_8 (3)8 ( 2 ) 8 (2)_8 (2)8
  5. 合并整数部分与小数部分便得到了对应的八进制数: ( 11064.04432 ) 8 (11064.04432)_8 (11064.04432)8

可以看到,整个转换过程,并没有涉及到任何计算,因此通过二进制的直接转化法来完成转换是十分方便的。

既然进制之间可以相互转换,那么同一个式子在不同进制下的运算结果如果转换成同一进制,那么其数值是否相同呢?

咱们还是以 5.8 + 0.9 5.8 + 0.9 5.8+0.9 这个式子为例,在十进制下,它的值为6.7,但是在十六进制下,它的值为6.1,那么 ( 6.1 ) 16 (6.1)_{16} (6.1)16 ( 6.7 ) 10 (6.7)_{10} (6.7)10的数值是否相同呢?我们根据按权展开相加法将 ( 6.1 ) 16 (6.1)_{16} (6.1)16 转换成十进制,其对应的值为:
6 × 1 6 0 + 1 × 1 6 − 1 = ( 6.0625 ) 10 6 × 16^0 + 1 × 16^{-1} = (6.0625)_{10} 6×160+1×161=(6.0625)10
显然, ( 6.0625 ) 10 ! = ( 6.7 ) 10 (6.0625)_{10} != (6.7)_{10} (6.0625)10!=(6.7)10。因此我们就能得到结论:

  • 同一个式子在不同进制下的运算结果是不相同的。

这里有朋友可能会疑惑,为什么 5.8 + 0.9 5.8 + 0.9 5.8+0.9 一定是十进制与十六进制的运算,为啥不是二进制和八进制之间的运算呢?

这是因为数码的限制,对于二进制来说,它的数码只有0和1,对于八进制来说,它的数码只有 0 ~ 7 0~7 07 因此,不可能出现 5.8 5.8 5.8 0.9 0.9 0.9 这两个数,因此在我们介绍的这四种数码中,只可能是十进制与十六进制的式子。

三、真值和机器数

在日常生活中,通常用正号、负号来分别表示正数(正号可以省略)和负数,如+15、-8等。这种带'+''-'符号的数称为真值。真值是机器数所代表的实际值。

在计算机中,通常将数的符号和数值部分一起编码,将数据的符号数字化,通常用’0’表示“正”,用’1’表示“负”。这种把符号“数字化”的数称为机器数。常用的有原码、补码和反码表示法。如0,101(这里的逗号','仅为区分符号位与数值位)表示+5。

结语

在今天的内容中我们介绍了不同的进制数以及它们之间的相互转换的内容:

  • r r r 进制转换 m m m 进制,可以借助十进制完成
  • 任意进制转化成十进制:按权展开相加法
  • 十进制转化成任意进制:
    • 整数部分:除基取余法
    • 小数部分:乘基取整法
  • 二进制与八进制和十六进制之间的相互转换:分组转化法
    • 二进制转八进制:二进制数码以3个为一组进行分组转化,必要时在整数部分最高位或小数部分最低位补0
    • 二进制转十六进制:二进制数码以4个为一组进行分组转化,必要时在整数部分最高位或小数部分最低位补0
    • 八进制转二进制:将八进制的每一位数码转换成3位数码的二进制
    • 十六进制转二进制,将十六进制的每一位数码转换成4位二进制的数码

今天的内容到这里就全部结束了,在下一篇内容中我们将介绍《BCD码》的相关内容,大家记得关注哦!如果大家喜欢博主的内容,可以点赞、收藏加评论支持一下博主,当然也可以将博主的内容转发给你身边需要的朋友。最后感谢各位朋友的支持,咱们下一篇再见!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2104344.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】C++中的关键字:const、mutable、auto、new....

七、C中的关键字:const、mutable、auto、new、 本部分打算是尽量多的罗列出C中的关键字和一些花式操作。先总结一下我们之前讲过的:private、public、protect: 参考【C】类、静态、枚举、重载、多态、继承、重写、虚函数_静态与多态:重写、重载、模板-C…

如何使用PTK一键安装opengaussdb 5.0

1、关于PTK工具 MogDB数据库是云和恩墨基于openGauss开源数据库打造,安稳易用的企业级关系型数据库。 PTK是云和恩墨出品的一款工具,帮助用户更便捷地部署管理MogDB数据库。 1.1 使用场景 开发人员快速启动多个本地 MogDB 环境用户通过 PTK 快速安装…

(2)Django生产环境数据库的切换以及环境配置python-dotenv方案

简介 本文分享下个人目前在用的,DRF项目开发环境、生产环境数据库切换的方案。没做过什么大项目,可能实现的不是那么优雅。 主要思路就是通过python-dotenv库,编辑.env环境配置文件区分开发环境和生产环境,再使用数据库路由&…

IP 协议详解

一、认识 IP 地址与网络层的职责 网络层是OSI七层模型中的第三层,也是TCP/IP四层模型中的网络接入层。在这一层,数据包被封装并加上IP层的头部信息,以便在网络之间传输。网络层的主要功能包括路由选择、分段与重组、拥塞控制以及IP地址管理等…

深度学习--机器学习相关(2)

1.适 应 性 矩 估 计 适应性矩估计(Adaptive Moment Estimation,Adam)是一种可以代替传统的梯度下降 (SGD 和 MBGD) 的优化算法。Adam算法结合了适应性梯度算法和均方根传播的优点。 Momentum 在学习机器学习时是很可能遇到的,是动量的意思。动量不是速度和学…

智能提醒助理系列-AIGC模型如何对接公众号2-扣子

本系列文章记录“智能提醒助理”wx公众号 建设历程。 一、需求出发点 在公众号中对接上大模型。 二、实现路径分析 上次使用直接调用火山引擎大模型的方案:智能提醒助理系列-AIGC模型如何对接公众号 近期 跟朋友跟朋友交流的过程中发现,通过扣子制作…

一招制胜!掌握 Python 中pip的8个必备命令

在Python编程中,pip 是一个非常重要的工具。它是Python包管理器,帮助你安装、更新、删除和管理Python软件包。如果你想要轻松地使用第三方库(比如requests、numpy、pandas),就离不开pip。 什么是 pip? pip…

Midjourney提示词——黑神话悟空角色生成提示词!

应广大群友和粉丝要求,我们也来盘一盘最近大火的黑神话悟空的提示词。 这里给大家准备了一份关于AI绘画详细的资料包,扫描下方二维码皆可获取! 1号齐天大圣 The full-body portrait of the Monkey King in-game, clad in intricate war rob…

Java运行环境的下载、安装、配置与运行

一、实验目的及要求 目的:掌握如何下载java JDK软件包,如何设置Java程序的运行环境,如何编写与运行Java程序,了解Java概貌。 要求: 1、安装Java JDK软件包; 2、练习编写简单的Java Application程序并掌握…

2.5 SQL注入之文件读写

SQL注入之文件读写 文件读写注入的原理 就是利用文件的读写权限进行注入,它可以写入一句话木马,也可以读取系统文件的敏感信息。 文件读写注入的条件 高版本的MYSQL添加了一个新的特性secure_file_priv,该选项限制了mysql导出文件的权限 …

步进、闭环、交流伺服三类电机驱动方案对比

1、步进、闭环、交流伺服产品对比 2.4步进电机特点 低速力矩大,转矩会随着转速的提高而降低,一般在800rpm以上力矩下降加快,精度是步距角的3%~5%,整圈没有累积误差,两相混合步进电机精度为0.18;步进电机采…

黑神话悟空小黄龙怎么打 妖王小黄龙攻略

​黑神话悟空小黄龙是游戏中难度较高的BOSS之一,击败他可以解锁[龙]变身、解锁橙武[飞龙宝杖],如果想要获得这两个法宝却又不知道如何击败小黄龙的话,一起来看看下面这篇攻略吧。 一、BOSS位置 【盘丝岭】-【盘丝洞】-【堕龙壁】。 二、Boss…

深入探索Springboot2.x依赖注入Bean的CGLIB代理类

问题起源 笔者最近在做一个功能,使用了工厂模式/策略模式设计的,定义了一个接口,下面有多种实现并通过Component注解定义为Bean,在运行时根据不同的业务调用不同实现的Bean,所以需要在运行时动态获取Bean。因此&#…

Keil5如何生成静态库.lib文件

一、这是一个Keil5工程 二、我想把这个文件输出成一个.lib文件,里面有一个加法函数,其它工程想实现加法只需调用这个函数即可 三、因为我只需要输出这一个文件成.lib,所以我需要屏蔽其它文件 1、右键其它文件,点击这个 2、把这个…

欧元承压续跌,黄金市场波动待指引

欧元兑美元延续跌势,季节性因素加剧市场担忧 ,欧元/美元汇率继续徘徊在两周低点附近,美元的强势表现以及即将公布的关键经济数据共同施压欧元。市场分析指出,欧元在9月的历史表现普遍不佳,尤其是过去五年连续下跌的记录…

深入理解神经网络:从基础到深度学习

深入理解神经网络:从基础到深度学习 前言1. 神经元模型的构建代码示例:M-P神经元模型 2. 感知机与多层网络的实现代码示例:简单感知机模型 3. 误差逆传播算法(BP)的实践代码示例:BP算法的简化实现 4. 探索全…

Altium Designer爬虫工具/网页信息获取工具

使用Altium Designer脚本系统的爬虫功能,可以有效的提高数据处理能力,作为新质生产力工具,可以在很多方面使用到爬虫功能或者网页信息读取功能,如一份原理图文档有很多的物料,需要整理这些物料的价格、是否有现货和数据…

HiGPT:异构图语言模型的突破

人工智能咨询培训老师叶梓 转载标明出处 人工智能领域的一大挑战是如何从海量复杂的数据中提取有价值的信息,特别是在处理异构图数据时。异构图由多种类型的节点和边组成,它们之间的相互关系丰富而复杂。传统的图神经网络(GNNs)在…

2024最新PyCharm下载安装激活汉化教程!(附激活码)

激活码(文末附带精品籽料): K384HW36OB-eyJsaWNlbnNlSWQiOiJLMzg0SFczNk9CIiwibGljZW5zZWVOYW1lIjoibWFvIHplZG9uZyIsImxpY2Vuc2VlVHlwZSI6IlBFUlNPTkFMIiwiYXNzaWduZWVOYW1lIjoiIiwiYXNzaWduZWVFbWFpbCI6IiIsImxpY2Vuc2VSZXN0cmljdGlvbiI6I…

【NAT】NAT:实现网络地址转换

目录 什么是NAT?NAT的功能NAT的弊端NAT的工作原理NAT分类SNAT(源NAT)DNAT(目的NAT)双向NAT 什么是NAT? NAT是一种在IP数据包传输过程中,将源IP地址或目标IP地址在私有网络和公有网络之间进行转…