(学习笔记)2.1 信息存储(2.1.1 十六进制表示法)

文章目录


线索栏

  1. 计算机内存的最小可寻址单位是什么?程序视角中的"内存"叫什么?
  2. C语言中"指针"的本质是什么?它和"类型"有什么关系?
  3. 为什么需要十六进制表示法?相比于二进制和十进制,它的优势是什么?
  4. 单个十六进制数字对应多少位二进制数?
  5. 如何快速将2的n次幂(如211)转换为十六进制?
  6. (复习)如何进行十六进制与二进制之间的快速转换?
  7. (复习)如何进行十进制与十六进制之间的转换?

笔记栏

引言部分

1)最小可寻址单位

字节(Byte, 8位)。

2)虚拟内存

机器级程序将内存视为一个巨大的字节数组,每个字节有唯一地址。此"统一视图"由DRAM、磁盘、OS等协作实现(详见第9章)。

3)指针(C语言)

(1)本质:一个存储块的首字节的虚拟地址。

(2)值与类型:指针的值是地址;类型指示了该地址起始处存储的对象的类型(如int*, float*)。编译器利用类型信息生成正确的机器指令,但机器码本身不包含类型信息。

(3)作用:引用数据结构(如数组)元素的机制。

2.1.1 十六进制表示法

1)为什么是十六进制?

(1)二进制:冗长,不便于人类阅读和书写。

(2)十进制:与位模式转换麻烦。

(3)十六进制:每1位十六进制数对应4位二进制数,转换直观,是二进制简洁的简写形式,是表示位模式的理想工具。

2)进制转换的核心方法与技巧

十六进制 ↔ 二进制(核心,必须掌握)

(1)Hex → Bin:将每个十六进制数字直接展开为4位二进制。

例:0x173A4C → 0001 0111 0011 1010 0100 1100

(2)Bin → Hex:从右向左每4位一组(最左一组可少于4位,左补0),每组转为1位十六进制。

例:11 1100 1010 1101 1011 0011 → 0011 1100 1010 1101 1011 0011 → 0x3CADB3

(3)记忆技巧:重点记住A(10), C(12), F(15)的十进制值,B(11), D(13), E(14)可推算。

2的幂次 ↔ 十六进制(快速技巧)

(1)若 x = 2n,其二进制为 1 后跟 n 个 0。

(2)十六进制中,每4个二进制0对应一个十六进制0。

(3)快速算法:将 n 表示为 i + 4j(0 ≤ i ≤ 3),则十六进制形式为:1,2,4,8 中第 i 个数字,后跟 j 个十六进制0。

例:211, n=11=3+4 * 2 → i=3对应开头数字8,j=2→跟2个0,结果为0x800。

十进制 ↔ 十六进制(一般方法)

(1)Dec → Hex(连除法):反复除以16,记录余数(转为十六进制数字),直到商为0。余数序列从后向前读即为结果。

例:314156 → 0x4CB2C(计算过程见教材)。

(2)Hex → Dec(乘权求和):每位数字乘以对应的16的幂次,然后求和。

例:0x7AF = 7 * 162+ 10 * 16 + 15 = 1967。

(3)工具:大数转换建议使用计算器或搜索引擎。

混合进制运算

(1)原则:统一进制后再计算。

(2)方法:将非十六进制数转换为十六进制,然后进行十六进制加减法。

例:0x503c + 64 → 64(Dec) = 0x40 → 0x503c + 0x40 = 0x507c。

十六进制加减法:逢16进1,借1当16。

练习题

(1)练习题2.1(进制转换)

A. 0x39A7F8→ 0011 1001 1010 0111 1111 1000

B. 1100 1001 0111 1011→ 0xC97B

C. 0xD5E4C→ 1101 0101 1110 0100 1100

D. 1001 1011 1001 1110 1101 0101→ 0x9B9ED5

答案:

(2)练习题2.2(2的幂次表)

运用 n = i + 4j速算法填充。例如 219, n=19=3+4 * 4→ 0x80000。

答案:

(3)练习题2.3(字节模式转换)

综合运用十进制、二进制、十六进制间的转换。例如十进制167:

167 = 128 + 32 + 4 + 2 + 1 → 二进制 1010 0111→ 十六进制 0xA7。

答案:

(4)练习题2.4(十六进制运算)

关键:将非十六进制数(如十进制64)先转换为十六进制(0x40)。

计算:如同十进制加减,注意进位/借位以16为基数。

A. 0x503c + 0x8 = 0x5044

B. 0x503c - 0x40 = 0x4ffc

C. 0x503c + 64 = 0x503c + 0x40 = 0x507c

D. 0x50ea - 0x503c = 0xAE

答案:


总结

本节构建了程序看待内存的基础模型------虚拟地址空间,并引入了C语言中指针作为地址引用的核心概念。为了高效地表示和操作内存中的位模式,十六进制表示法成为了关键工具。

必须熟练掌握的核心技能:

  1. 十六进制与二进制间的快速互转(基于4位一组的对应关系)。
  2. 2的幂次在十六进制中的表示规律(n = i + 4j速算法)。
  3. 在十六进制下直接进行算术运算(避免绕道十进制)。

这些技能是后续理解数据的具体存储格式(整数、浮点数)和进行底层调试(如用调试器查看内存内容)的必备前提。

相关推荐
for_ever_love__3 小时前
UI学习:UISearchController基础了解和应用
学习·ui·ios·objective-c
心中有国也有家3 小时前
GE图引擎深度解析——CANN的计算图优化与执行引擎
人工智能·pytorch·python·学习·numpy
東雪木4 小时前
多线程与并发编程 专属复习笔记
java·开发语言·笔记·java面试
GHL2842710904 小时前
换脸工作流学习
学习·ai
_李小白5 小时前
【android opencv学习笔记】Day 28: 滤波算法之中值滤波器
android·opencv·学习
Oll Correct5 小时前
实验二十九:TCP的运输连接管理
网络·笔记
飞翔中文网6 小时前
Java学习笔记之抽象类与接口(设计思想)
java·笔记·学习
智者知已应修善业7 小时前
【proteus设计文氏正弦波信号发生器】2023-5-9
驱动开发·经验分享·笔记·硬件架构·proteus·硬件工程
土星碎冰机7 小时前
xxljob学习(大白话版本)
学习·运维开发
吃好睡好便好7 小时前
说说免疫力的维护
学习·生活