C语言学习笔记——存储器与进制

上一篇历史知识里提到存储器时只说了句”分内存、外存”. 但真到算容量、算地址、看八进制常量的时候, 这些概念是绕不开的, 所以单独开一篇.

这一篇在卷面上的权重不低: 进制转换几乎年年有, 地址与容量的计算题也常出. 而”各类存储介质的特点”这种纯背诵的内容近年考得很少, 书上却写得极多, 下面会明确标出哪些看一眼就行.

计算部分(地址与容量、进制互转)是必考的, 建议连例题一起动手算一遍; 概念部分只需记结论

0 综述

1
2
3
4
5
6
7
8
9
10
11
存储器与进制
├── 1 存储器基础(★★★★)
│ ├── 存储单元与存储地址
│ ├── 存储单位(bit/B/KB/MB/GB/TB)
│ └── 内存与外存的区别
├── 2 地址与容量计算(★★★★★)
│ └── 地址总线根数 → 寻址范围
├── 3 进制转换(★★★★★)
│ ├── 十 ↔ N
│ └── 二 ↔ 八 ↔ 十六(不必过十进制)
└── 4 各类进制的用途与优缺点(★★)

1 存储器基础(★★★★)

1.1 存储单位

从小到大共六层. 相邻两级之间除了 bit 与 B 是 8 倍, 其余都是 1024 倍:

单位 换算
bit(位/比特) 最小单位, 一位数字, 取值 0 或 1
B(Byte, 字节) 1 B = 8 bit
KB 1 KB = 1024 B
MB 1 MB = 1024 KB
GB 1 GB = 1024 MB
TB 1 TB = 1024 GB
PB 1 PB = 1024 TB

再往上还有EB, ZB, YB等, 了解即可

易错点: 1024 是 , 不是1000. 只有 bit 和 B 之间是 8 倍关系, 别把它和 1024 混在一起

另外 B 与 b 大小写有区别: B 是字节, b 是位. 网速常说的 Mbps 里的 b 就是位, 所以 100Mbps 实际约 12.5MB/s

注意区分位, 字和字节: 位(比特)为最小计量单位; 字节 其次, 是常用单位中最小计量单位; 字则是实际应用场景中的英文字/汉字等, 这里不展开

1.2 存储单元与存储地址

存储器被划分成若干个存储单元, 每个存储单元存放固定长度的二进制信息. 给每个存储单元编一个号, 这个编号就是存储地址.

打个比方, 一个学校(存储器)被划分成若干个班级(存储单元), 每个班级能容纳固定人数的学生. 给每个班级编一个号, 这个编号就是班级编号(存储地址)

1
2
3
4
5
6
7
8
存储器
┌─────────┐
│ 存储单元 │ ← 地址 0
├─────────┤
│ 存储单元 │ ← 地址 1
├─────────┤
│ 存储单元 │ ← 地址 2
└─────────┘ ...
概念 含义
存储单元 存放数据的基本单位
存储地址 存储单元的编号, 是”门牌号”而不是”房间里的内容”

一个存储单元通常是 1 个字节(8 位). 按字节编址时, 每个地址对应 1 字节.

如果问”一个存储单元存放多少位”, 按现行考试口径答 8 位(1字节). 注意区分: 存储单元是字节, 而一个字(word)通常是多个字节

存储单元的内容和存储单元的地址是两回事: 地址是编号, 内容才是数据. 这点在学指针时还要用到

1.3 内存与外存

对比项 内存(主存) 外存(辅存)
速度 快 慢
容量 小 大
价格 贵(单位容量) 便宜
断电后 数据丢失 数据保留
能否被 CPU 直接访问 能 不能, 需先调入内存
常见例子 内存条(RAM)、ROM 硬盘、U盘、光盘

核心区别就两条: 断电是否丢失, 以及 CPU 能否直接访问(二者均为内存独有性质)

16GB + 1TB 的电脑, 16GB 是内存, 1TB 是外存

常见家用电脑的内存在8GB朝上, B, KB, MB, GB一般用于形容文件大小, TB, PB用于形容大型硬盘、服务器等外存大小

2 地址与容量计算(★★★★★)

2.1 计算公式

地址总线的根数决定了 CPU 能寻址多少个存储单元.

就如门牌号的位数(地址总线的根数)决定了该楼最多有多少个可被编号的房间(存储单元), 例如十进制下3位门牌号则最多只能编号 个房间

存储单元个数地址线根数

这是因为每根地址线只能表示 0 或 1, 根线就能组合出 个不同的地址编号

再配上”1 个单元 1 字节”, 就能把单元个数换算成容量:

地址线根数 存储单元个数 容量
10 = 1024 1 KB
16 = 65536 64 KB
20 = 1048576 1 MB
24 16 MB
32 4 GB

这几组建议直接背下来, 尤其 10根=1KB、20根=1MB、32根=4GB.

2.2 计算例题

例1: 地址总线有 20 根, 按字节编址, 求最大内存容量.

个单元

例2: 内存容量为 64KB, 求至少需要多少根地址线.

根数根

例3: 内存容量为 4GB, 地址总线根数至少是多少.

根

*2.3 相关拓展

*2.3.1 按字编址

展开

如果题目说”按字编址”(那这出题人无敌了)且一个字占 2 字节(一个中文字占2~4字节不等, 取决于编码类型), 同样的地址线能寻到的字节数会变成 2 倍, 但单元个数不变

举个对比例子, 同样给20根地址总线

编址方式 一个地址对应 可寻址单元个数 每个单元大小 能寻到的总字节数
按字节编址(默认) 1 B 个 1 B
按字编址, 1 字 = 2 B 1 字 个 2 B

对比结论:

1
2
3
4
地址线根数没变: 20 根
可寻址单元个数没变: 都是 2^20 个
每个单元大小变了: 1 B → 4 B
总字节数变了: 1 MB → 4 MB

再反过来看一个例子, 更清楚:

1
2
3
4
5
6
7
8
9
内存容量固定为 64 KB.

按字节编址:
64 KB = 2^16 B
需要 16 根地址线

按字编址, 1 字 = 2 B:
64 KB = 2^16 B = 2^15 个字
需要 15 根地址线.

也就是说:

  • 同样地址线, 按字编址能寻到的字节数变多;
  • 同样容量, 按字编址需要的地址线变少;
  • 但不管哪种, 地址线根数始终对应”可寻址单元个数(位数/比特数)“是 个

而各自的优缺点也就明了了: 按字节编址更为精细但所需地址总线数量更多; 而按字编制则反之, 精细度下降(寻址粒度变粗)

*2.3.2 总线

总线是CPU与存储设备之间连接的桥梁, 一共有三种总线, 对应三种不同的功能: 地址总线, 数据总线和控制总线, 后面二者分别负责数据传输和传送控制信号和状态信号

数据总线的根数决定一次能传输的数据位数

3 进制转换(★★★★★)

3.1 各类进制的基本规则

进制 基数 数码 C语言中的写法
二进制 2 0, 1 无直接字面量写法(高级语言中几乎都没用直接写法)
八进制 8 0 ~ 7 以 0 开头, 如 015
十进制 10 0 ~ 9 无前缀, 如 15
十六进制 16 0~9, A~F 以 0x 或 0X 开头, 如 0x2A

注意八进制前有前导0

3.2 十进制 → N 进制

方法: 除 N 取余, 倒序排列(针对整数部分).

以 转二进制为例:

1
2
3
4
5
6
7
8
9
259 ÷ 2 = 129 ... 余 1   ↑
129 ÷ 2 = 64 ... 余 1 ↑
64 ÷ 2 = 32 ... 余 0 ↑
32 ÷ 2 = 16 ... 余 0 ↑
16 ÷ 2 = 8 ... 余 0 ↑ 倒着读
8 ÷ 2 = 4 ... 余 0 ↑
4 ÷ 2 = 2 ... 余 0 ↑
2 ÷ 2 = 1 ... 余 0 ↑
1 ÷ 2 = 0 ... 余 1 ↑

从下往上读余数, 得到

因为越靠下的数字除以2的次数更多, 从而位次更高, 应放在前面

小数部分另算: 乘 2 取整, 正序排列, 与整数部分方向相反, 是因为乘以2的次数越多, 位次更低, 应放在后面

带小数的例子: 转二进制

整数部分 :

1
2
3
4
5
25 ÷ 2 = 12 ... 余 1   ↑
12 ÷ 2 = 6 ... 余 0 ↑
6 ÷ 2 = 3 ... 余 0 ↑ 倒着读
3 ÷ 2 = 1 ... 余 1 ↑
1 ÷ 2 = 0 ... 余 1 ↑

得到 .

小数部分 :

1
2
3
4
5
6
7
8
9
10
0.9 × 2 = 1.8 → 取整 1, 余 0.8
0.8 × 2 = 1.6 → 取整 1, 余 0.6
0.6 × 2 = 1.2 → 取整 1, 余 0.2
0.2 × 2 = 0.4 → 取整 0, 余 0.4
0.4 × 2 = 0.8 → 取整 0, 余 0.8
0.8 × 2 = 1.6 → 取整 1, 余 0.6
0.6 × 2 = 1.2 → 取整 1, 余 0.2
0.2 × 2 = 0.4 → 取整 0, 余 0.4
0.4 × 2 = 0.8 → 取整 0, 余 0.8
...

正序读整数部分, 得到 , 出现循环.

所以:

小数转换不保证有限位, 很多十进制小数转二进制会无限循环

3.3 N 进制 → 十进制

方法: 按权展开求和.

从右往左数, 最右边一位是

带小数的例子: 转十进制

此处使用了无穷等比数列求和公式

同理八进制转十进制:

3.4 二 ↔︎ 八、二 ↔︎ 十六

这两个转换不需要经过十进制, 直接分组即可, 是最省时间的路径.

二进制 → 八进制: 三位一组, 从右往左分, 不足补 0.

1
101101  →  101 101  →  5 5  →  55(八进制)

二进制 → 十六进制: 四位一组, 从右往左分, 不足补 0.

1
101101  →  0010 1101  →  2 D  →  2D(十六进制)

反过来一样, 一位八进制展开成三位二进制, 一位十六进制展开成四位:

1
2
55(8)   → 101 101
2D(16) → 0010 1101

八进制与十六进制互转: 先转二进制再分组即可, 别从十进制走

十六进制里 A=10, B=11, C=12, D=13, E=14, F=15 必须记牢

4 各类进制的用途与优缺点(★★)

这一节基本只出选择题, 记结论即可.

进制 优点 缺点 主要用途
二进制 只有两个状态, 物理上最易实现(通/断); 运算规则简单 书写太长, 人不易读 计算机内部的一切表示
八进制 与二进制转换方便(3位一组), 比二进制短 现代计算机字长多为 8 的倍数, 分组不便 早期使用, 现已较少
十六进制 与二进制转换方便(4位一组), 正好对应字节 需要记 A~F 内存地址、字节数据的常见书写形式
十进制 符合人的习惯 计算机不能直接处理 人机交互的输入输出

核心逻辑: 计算机内部只用二进制, 其余进制都是为了让人看着方便或转换方便