This commit is contained in:
许大仙 2024-08-04 11:07:34 +08:00
parent 186b9a4c2b
commit 687ce9d4b9

View File

@ -960,9 +960,24 @@ int main() {
} }
``` ```
## 3.3 进制的转换 ## 3.3 进制的运算规则
### 3.3.1 概述 * `十进制`的运算规则,如下所示:
* 逢`十`进`一`(针对加法而言)。
* 借`一`当`十`(针对减法而言)。
* `二进制`的运算规则,如下所示:
* 逢`二`进`一`(针对加法而言)。
* 借`一`当`二`(针对减法而言)。
* `八进制`的运算规则,如下所示:
* 逢`八`进`一`(针对加法而言)。
* 借`一`当`八`(针对减法而言)。
* `十六进制`的运算规则,如下所示:
* 逢`十六`进`一`(针对加法而言)。
* 借`一`当`十六`(针对减法而言)。
## 3.4 进制的转换
### 3.4.1 概述
* 不同进制的转换,如下所示: * 不同进制的转换,如下所示:
@ -972,9 +987,9 @@ int main() {
![](./assets/20.png) ![](./assets/20.png)
### 3.3.2 二进制和十进制的转换 ### 3.4.2 二进制和十进制的转换
#### 3.3.2.1 二进制转换为十进制 #### 3.4.2.1 二进制转换为十进制
* 规则:从最低位开始,将每个位上的数提取出来,乘以 2 的 (位数 - 1 )次方,然后求和。 * 规则:从最低位开始,将每个位上的数提取出来,乘以 2 的 (位数 - 1 )次方,然后求和。
@ -995,7 +1010,7 @@ int main() {
![](./assets/22.png) ![](./assets/22.png)
#### 3.3.2.2 十进制转换二进制 #### 3.4.2.2 十进制转换二进制
* 规则:将该数不断除以 2 ,直到商为 0 为止,然后将每步得到的余数倒过来,就是对应的二进制。 * 规则:将该数不断除以 2 ,直到商为 0 为止,然后将每步得到的余数倒过来,就是对应的二进制。
@ -1017,7 +1032,7 @@ int main() {
![](./assets/24.png) ![](./assets/24.png)
### 3.3.3 二进制转八进制 ### 3.4.3 二进制转八进制
* 规则:每 3 位二进制就是一个八进制。 * 规则:每 3 位二进制就是一个八进制。
@ -1029,7 +1044,7 @@ int main() {
### 3.3.4 二进制转十六进制 ### 3.4.4 二进制转十六进制
* 规则:每 4 位二进制就是一个十六进制。 * 规则:每 4 位二进制就是一个十六进制。
@ -1039,9 +1054,9 @@ int main() {
![](./assets/26.png) ![](./assets/26.png)
## 3.4 原码、反码和补码 ## 3.5 原码、反码和补码
### 3.4.1 概述 ### 3.5.1 概述
* 机器数一个数在计算机的存储形式是二进制我们称这些二进制数为机器数。机器数可以是有符号的用机器数的最高位来存放符号位0 表示正数1 表示负数。 * 机器数一个数在计算机的存储形式是二进制我们称这些二进制数为机器数。机器数可以是有符号的用机器数的最高位来存放符号位0 表示正数1 表示负数。
@ -1051,7 +1066,7 @@ int main() {
![](./assets/28.png) ![](./assets/28.png)
### 3.4.2 原码 ### 3.5.2 原码
* 原码的表示与机器数真值表示的一样,即用第一位表示符号,其余位表示数值。 * 原码的表示与机器数真值表示的一样,即用第一位表示符号,其余位表示数值。
* 规则: * 规则:
@ -1073,7 +1088,7 @@ int main() {
> >
> 按照原码的规则,会出现 `+0``-0` 的情况,即:`0`000 0000+0、`1`000 0000-0显然不符合实际情况所以计算机底层虽然存储和计算的都是二进数但显然不是原码。 > 按照原码的规则,会出现 `+0``-0` 的情况,即:`0`000 0000+0、`1`000 0000-0显然不符合实际情况所以计算机底层虽然存储和计算的都是二进数但显然不是原码。
### 3.4.3 反码 ### 3.5.3 反码
* 规则: * 规则:
@ -1096,7 +1111,7 @@ int main() {
> >
> 按照反码的规则,如果是 `+0`,对应的原码是 `0`000 0000那么其反码还是 `0`000 0000 ;如果是 `-0`,对应的原码是 `1`000 0000其反码是 `1`111 1111显然不符合实际情况所以计算机底层虽然存储和计算的都是二进数但显然不是反码。 > 按照反码的规则,如果是 `+0`,对应的原码是 `0`000 0000那么其反码还是 `0`000 0000 ;如果是 `-0`,对应的原码是 `1`000 0000其反码是 `1`111 1111显然不符合实际情况所以计算机底层虽然存储和计算的都是二进数但显然不是反码。
### 3.4.4 补码 ### 3.5.4 补码
* 规则: * 规则:
@ -1128,13 +1143,13 @@ int main() {
> * ②补码使得`加法运算`和`减法运算`可以统一处理,通过将减法运算`转换`为加法运算,可以简化硬件设计,提高了运算效率。 > * ②补码使得`加法运算`和`减法运算`可以统一处理,通过将减法运算`转换`为加法运算,可以简化硬件设计,提高了运算效率。
> * ③ 计算机底层`存储`和`计算`的都是`二进数的补码`。 > * ③ 计算机底层`存储`和`计算`的都是`二进数的补码`。
### 3.4.5 总结 ### 3.5.5 总结
* ① 正数的原码、反码和补码都是一样的,三码合一。 * ① 正数的原码、反码和补码都是一样的,三码合一。
* ② 负数的反码是在其原码的基础上按位取反0 变 1 1 变 0 ),符号位不变;负数的补码是其反码 + 1 。 * ② 负数的反码是在其原码的基础上按位取反0 变 1 1 变 0 ),符号位不变;负数的补码是其反码 + 1 。
* ③ 0 的补码是 0 。 * ③ 0 的补码是 0 。
## 3.5 计算机底层为什么使用补码? ## 3.6 计算机底层为什么使用补码?
* 如果计算是 `2 - 2` ,那么可以转换为 `2 + (-2)`,这样计算机内部在处理`减法计算`的时候,就会将其转换为`加法计算`的形式,以简化硬件设计和提高计算效率。 * 如果计算是 `2 - 2` ,那么可以转换为 `2 + (-2)`,这样计算机内部在处理`减法计算`的时候,就会将其转换为`加法计算`的形式,以简化硬件设计和提高计算效率。
* `最高位`表示`符号位`,由于符号位的存在,如果使用`原码`来计算,就会导致`计算结果不正确`,即: * `最高位`表示`符号位`,由于符号位的存在,如果使用`原码`来计算,就会导致`计算结果不正确`,即: