158 lines
4.1 KiB
Markdown
158 lines
4.1 KiB
Markdown
计算机底层使用二进制来表示和处理数据。最基本的单位是 bit(位),8 个 bit 组成 1 个 Byte(字节)。
|
||
|
||
## 1、常见数据单位
|
||
|
||
- bit:位,二进制中的一位,只能表示 0 或 1
|
||
- Byte:字节,1 Byte = 8 bit
|
||
- KB、MB、GB:常见存储单位,通常按 1024 进制换算
|
||
|
||
## 2、常见进制
|
||
|
||
计算机相关场景中,常见的进制有以下几种:
|
||
|
||
- 二进制:逢 2 进 1,只包含 0 和 1
|
||
- 八进制:逢 8 进 1,包含 0 到 7
|
||
- 十进制:逢 10 进 1,包含 0 到 9
|
||
- 十六进制:逢 16 进 1,包含 0 到 9 和 A 到 F
|
||
|
||
之所以经常提到二进制,是因为电路天然适合表示高低电平,而 0 和 1 正好对应这种状态。
|
||
|
||
## 3、进制转换
|
||
|
||
在 Linux 中可以使用 `bc` 命令做进制转换和数学计算。
|
||
|
||
### 3.1 `bc` 中常用参数
|
||
|
||
- `ibase`:输入数字的进制
|
||
- `obase`:输出结果的进制
|
||
|
||
一般建议**先设置 `obase`,再设置 `ibase`**。
|
||
因为设置 `ibase` 之后,后面输入的数字会按照新的输入进制解释,如果顺序写反,容易得到错误结果。
|
||
|
||
### 3.2 十进制转二进制
|
||
|
||
```shell
|
||
[root@tencentos ~]# bc
|
||
obase=2
|
||
ibase=10
|
||
10
|
||
1010
|
||
```
|
||
|
||
表示把十进制的 `10` 转换成二进制,结果是 `1010`。
|
||
|
||
### 3.3 二进制转十进制
|
||
|
||
```shell
|
||
[root@tencentos ~]# bc
|
||
obase=10
|
||
ibase=2
|
||
1010
|
||
10
|
||
```
|
||
|
||
表示把二进制的 `1010` 转换成十进制,结果是 `10`。
|
||
|
||
### 3.4 八进制转二进制
|
||
|
||
```shell
|
||
echo "obase=2;ibase=8;17" | bc
|
||
1111
|
||
```
|
||
|
||
八进制 `17` 转为二进制后是 `1111`。
|
||
|
||
### 3.5 计算幂
|
||
|
||
```shell
|
||
echo "2^10" | bc
|
||
1024
|
||
```
|
||
|
||
这个例子常用于理解存储单位和位数相关计算。
|
||
|
||
## 4、什么是 32 位和 64 位
|
||
|
||
平时说的 32 位、64 位,通常和以下几个概念有关:
|
||
|
||
- CPU 架构位宽
|
||
- 操作系统位数
|
||
- 应用程序位数
|
||
|
||
它们彼此相关,但**不是完全等价**的概念。
|
||
|
||
### 4.1 CPU 位宽
|
||
|
||
CPU 位宽通常表示 CPU 一次处理数据的能力,以及它在地址计算上的能力范围。常见的是 32 位和 64 位。
|
||
|
||
### 4.2 操作系统位数
|
||
|
||
操作系统位数表示当前安装的系统是 32 位还是 64 位。一般来说:
|
||
|
||
- 64 位 CPU 可以安装 32 位或 64 位操作系统
|
||
- 32 位 CPU 通常只能安装 32 位操作系统
|
||
|
||
### 4.3 应用程序位数
|
||
|
||
在 64 位操作系统上,很多情况下可以运行 32 位应用程序;但在 32 位操作系统上,通常不能运行 64 位应用程序。
|
||
|
||
## 5、32 位和 64 位的主要区别
|
||
|
||
### 5.1 数据处理能力
|
||
|
||
64 位系统一次可以处理更宽的数据,在大数据计算、图形处理、科学计算等场景下通常更有优势。
|
||
|
||
### 5.2 内存寻址能力
|
||
|
||
32 位系统理论上最多可寻址 \(2^{32}\) 个地址,也就是约 4 GB 内存空间。
|
||
|
||
64 位系统的理论寻址范围远大于 32 位系统,能够支持更大的内存空间。不过实际可用内存还会受到硬件、内核和操作系统版本的限制。
|
||
|
||
### 5.3 软件兼容性
|
||
|
||
- 64 位操作系统通常兼容很多 32 位程序
|
||
- 32 位操作系统一般不能运行 64 位程序
|
||
|
||
## 6、如何查看系统位数
|
||
|
||
### 6.1 使用 `arch`
|
||
|
||
```shell
|
||
[root@tencentos ~]# arch
|
||
x86_64
|
||
```
|
||
|
||
`x86_64` 表示当前机器架构是 64 位架构。
|
||
|
||
### 6.2 使用 `uname -m`
|
||
|
||
```shell
|
||
[root@tencentos ~]# uname -m
|
||
x86_64
|
||
```
|
||
|
||
这个命令也是查看机器架构时非常常用的方法。
|
||
|
||
### 6.3 使用 `getconf LONG_BIT`
|
||
|
||
```shell
|
||
[root@tencentos ~]# getconf LONG_BIT
|
||
64
|
||
```
|
||
|
||
这个命令更直观,可以直接看到当前用户空间是 32 位还是 64 位。
|
||
|
||
## 7、常见误区
|
||
|
||
- `arch` 显示 `x86_64`,更准确地说是**机器架构为 64 位**,不一定能单独代表所有应用程序都是 64 位
|
||
- 64 位系统不一定“绝对更快”,性能还和 CPU、内存、程序本身的实现有关
|
||
- 32 位系统理论可寻址 4 GB,但实际可用内存通常会更少
|
||
|
||
## 8、小结
|
||
|
||
- 计算机底层使用二进制处理数据
|
||
- `bit` 是最小单位,`1 Byte = 8 bit`
|
||
- `bc` 可以完成常见进制转换和数学计算
|
||
- 32 位和 64 位需要区分 CPU、操作系统、应用程序三个层面
|
||
- 查看系统位数时,`arch`、`uname -m`、`getconf LONG_BIT` 都很常用
|