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

进位计数制及其相互转换

  • 导读
  • 一、进位计数法
    • [1.1 基数](#1.1 基数)
    • [1.2 位权](#1.2 位权)
  • 二、不同进制数之间的相互转化
    • [2.1 转化方法](#2.1 转化方法)
    • [2.2 任意进制转化成十进制](#2.2 任意进制转化成十进制)
    • [2.3 十进制转化成任意进制](#2.3 十进制转化成任意进制)
    • [2.4 二进制、八进制以及十六进制之间的相互转换](#2.4 二进制、八进制以及十六进制之间的相互转换)
      • [2.4.1 二进制与八进制以及十六进制之间的关系](#2.4.1 二进制与八进制以及十六进制之间的关系)
      • [2.4.2 二进制数与八进制数之间的相互转换](#2.4.2 二进制数与八进制数之间的相互转换)
      • [2.4.3 八进制与十六进制的相互转换](#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 0、1两个数码,因此二进制的基数为2
  • 八进制数有 0 ~ 7 0~7 0~7八个数码,因此八进制的基数为8
  • 十进制数有 0 ~ 9 0~9 0~9十个数码,因此十进制的基数为10
  • 十六进制数有 0 ~ 9 , a ~ f (不区分大小写) 0~9,a~f(不区分大小写) 0~9,a~f(不区分大小写)十六个数码,因此十六进制的基数为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} KnKn−1...K0K−1...K−m的数值就可以表示为:
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} Kn⋅rn+Kn−1⋅rn−1+...+K0⋅r0+K−1⋅r−1+...+K−m⋅r−m

式中的 r r r 为基数, r i r^i ri是第 i i i 个数的位权(整数位最低位规定为第0位), K i K_i Ki 的取值可以是 0 ~ ( i − 1 ) 0~(i-1) 0~(i−1) 这 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} 22、21、20、2−1、2−2;
    • 其所对应的数值则是: 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×2−1+1×2−2=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} 82、81、80、8−1、8−2;
    • 其所对应的数值则是: 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×8−1+1×8−2=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} 102、101、100、10−1、10−2;
    • 其所对应的数值则是: 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×10−1+1×10−2=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} 162、161、160、16−1、16−2;
    • 其所对应的数值则是: 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×16−1+1×16−2=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} KnKn−1...K0K−1...K−m,我们要将其转换成十进制的话,则可通过下列式子来完成转换:
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} Kn⋅rn+Kn−1⋅rn−1+...+K0⋅r0+K−1⋅r−1+...+K−m⋅r−m

如二进制的混合数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×2−1+1×2−2=(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 取余。
c 复制代码
//整数部分------除基取余法
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 取整
c 复制代码
//小数部分------乘基取整法
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 0~1;

第二位位权值 2 1 2^1 21 能够表示的数值范围是 0 ~ 3 0~3 0~3;

第三位位权值 2 2 2^2 22 能够表示的数值范围是 0 ~ 7 0~7 0~7;

第四位位权值 2 3 2^3 23 能够表示的数值范围是 0 ~ 15 0~15 0~15;

依次类推

第n位位权值 2 n 2^n 2n 能够表示的数值范围是 0 ~ 2 n − 1 0~2^n-1 0~2n−1;

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

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

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

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

c 复制代码
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 0~15 这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 0~7 所对应的二进制数码一一列举出来,然后进行直接转化:

( 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 转化成二进制,我们则需要将每一个字符依次进行除基取余,如下所示:
c 复制代码
//八进制转化二进制------分组转化法(除基取余法)
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------(011)2
(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×16−1=(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 0~7 因此,不可能出现 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码》的相关内容,大家记得关注哦!如果大家喜欢博主的内容,可以点赞、收藏加评论支持一下博主,当然也可以将博主的内容转发给你身边需要的朋友。最后感谢各位朋友的支持,咱们下一篇再见!!!

相关推荐
akbar&20 分钟前
计算机三级 - 数据库技术 - 第十三章 大规模数据库架构 笔记
数据库·笔记
sixteenyy38 分钟前
学习笔记(一)
笔记·学习
吃什么芹菜卷2 小时前
2024.9最新:CUDA安装,pytorch库安装
人工智能·pytorch·笔记·python·深度学习
云边有个稻草人2 小时前
【刷题】Day5--数字在升序数组中出现的次数
开发语言·笔记·算法
月夕花晨3742 小时前
C++学习笔记(26)
c++·笔记·学习
蜡笔小新星3 小时前
切换淘宝最新镜像源npm
vue.js·经验分享·学习·npm·node.js
管家婆客服中心3 小时前
管家婆云辉煌手机端怎么连接蓝牙打印机?
经验分享·管家婆软件·管家婆软件常见问题
zhangrelay4 小时前
Arduino IDE离线配置第三方库文件-ESP32开发板
笔记·学习·持续学习
我叫啥都行4 小时前
计算机基础知识复习9.13
linux·笔记·后端·系统架构
南斯拉夫的铁托4 小时前
线性代数(宋浩版)(4)
经验分享·笔记·线性代数