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

C语言学习笔记——存储器与进制
Kanwuqing上一篇历史知识里提到存储器时只说了句”分内存、外存”. 但真到算容量、算地址、看八进制常量的时候, 这些概念是绕不开的, 所以单独开一篇.
这一篇在卷面上的权重不低: 进制转换几乎年年有, 地址与容量的计算题也常出. 而”各类存储介质的特点”这种纯背诵的内容近年考得很少, 书上却写得极多, 下面会明确标出哪些看一眼就行.
计算部分(地址与容量、进制互转)是必考的, 建议连例题一起动手算一遍; 概念部分只需记结论
0 综述
1 | 存储器与进制 |
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 | 存储器 |
| 概念 | 含义 |
|---|---|
| 存储单元 | 存放数据的基本单位 |
| 存储地址 | 存储单元的编号, 是”门牌号”而不是”房间里的内容” |
一个存储单元通常是 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 | 1 KB | |
| 16 | 64 KB | |
| 20 | 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 | 地址线根数没变: 20 根 |
再反过来看一个例子, 更清楚:
1 | 内存容量固定为 64 KB. |
也就是说:
- 同样地址线, 按字编址能寻到的字节数变多;
- 同样容量, 按字编址需要的地址线变少;
- 但不管哪种, 地址线根数始终对应”可寻址单元个数(位数/比特数)“是
个
而各自的优缺点也就明了了: 按字节编址更为精细但所需地址总线数量更多; 而按字编制则反之, 精细度下降(寻址粒度变粗)
*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 | 259 ÷ 2 = 129 ... 余 1 ↑ |
从下往上读余数, 得到
因为越靠下的数字除以2的次数更多, 从而位次更高, 应放在前面
小数部分另算: 乘 2 取整, 正序排列, 与整数部分方向相反, 是因为乘以2的次数越多, 位次更低, 应放在后面
带小数的例子:
整数部分
1 | 25 ÷ 2 = 12 ... 余 1 ↑ |
得到
小数部分
1 | 0.9 × 2 = 1.8 → 取整 1, 余 0.8 |
正序读整数部分, 得到
所以:
小数转换不保证有限位, 很多十进制小数转二进制会无限循环
3.3 N 进制 → 十进制
方法: 按权展开求和.
从右往左数, 最右边一位是
带小数的例子:
此处使用了无穷等比数列求和公式
同理八进制转十进制:
3.4 二 ↔︎ 八、二 ↔︎ 十六
这两个转换不需要经过十进制, 直接分组即可, 是最省时间的路径.
二进制 → 八进制: 三位一组, 从右往左分, 不足补 0.
1 | 101101 → 101 101 → 5 5 → 55(八进制) |
二进制 → 十六进制: 四位一组, 从右往左分, 不足补 0.
1 | 101101 → 0010 1101 → 2 D → 2D(十六进制) |
反过来一样, 一位八进制展开成三位二进制, 一位十六进制展开成四位:
1 | 55(8) → 101 101 |
八进制与十六进制互转: 先转二进制再分组即可, 别从十进制走
十六进制里 A=10, B=11, C=12, D=13, E=14, F=15 必须记牢
4 各类进制的用途与优缺点(★★)
这一节基本只出选择题, 记结论即可.
| 进制 | 优点 | 缺点 | 主要用途 |
|---|---|---|---|
| 二进制 | 只有两个状态, 物理上最易实现(通/断); 运算规则简单 | 书写太长, 人不易读 | 计算机内部的一切表示 |
| 八进制 | 与二进制转换方便(3位一组), 比二进制短 | 现代计算机字长多为 8 的倍数, 分组不便 | 早期使用, 现已较少 |
| 十六进制 | 与二进制转换方便(4位一组), 正好对应字节 | 需要记 A~F | 内存地址、字节数据的常见书写形式 |
| 十进制 | 符合人的习惯 | 计算机不能直接处理 | 人机交互的输入输出 |
核心逻辑: 计算机内部只用二进制, 其余进制都是为了让人看着方便或转换方便
