一、信息的存储
几个重要概念:
- 虚拟内存 —— 机器级程序将内存视为一个非常大的字节数组,称为虚拟内存
- 虚拟地址空间 —— 虚拟内存中的每个字节都由一个唯一数字标识,称为它的地址。所有可能的地址的集合就称为虚拟地址空间
- 程序对象 —— 程序数据、指令和控制信息的统称
1.1、十六进制表示法
由于二进制表示法太冗长,十进制表示法又不容易与位模式进行转换,所以比较中庸的一个数值表示法是十六进制表示法。
①十六进制与二进制的转换
一个十六进制值可以转换为4个二进制位:
②十六进制与十进制的转换:
- 十六进制数字转换为十进制数字:用相应的16的幂乘以每个十六进制数字
- 十进制数字转换为十六进制数字:用16反复除十进制数字,最后使用最后一个余数放在最前面的方式将所有余数相连就是转换后的十六进制数。
1.2、字数据大小
字长指明指针数据的标称大小。
由于虚拟地址是以字长对应的字来编码的,所以字长大小决定了虚拟地址空间的最大大小。
对于一个位的机器来说,它能编码的虚拟地址的个数最多为
个,所以它的虚拟地址的范围就是0 ~
,程序也即最多能访问
个字节。
因此,可以算出32位字长的机器虚拟地址空间的最大大小为字节=4千兆字节=4GB。64位字长的机器虚拟地址空间的最大大小为
字节=16777216TB=16EB!
程序被称为"32位程序"或"64位程序",区别在于该程序是如何编译的,而不是其运行的机器类型。
程序可移植性的一个方面就是使程序对不同数据类型的确切大小不敏感。
1.3、寻址和字节顺序
在几乎所有的机器上,多字节对象都被存储为连续的字节序列,对象的地址为所使用字节中最小的地址。
机器存储字节的顺序:
- 小端法: 在内存中按照从最低有效字节到最高有效字节的顺序存储对象
- 大端法: 在内存中按照从最高有效字节到最低有效字节的顺序存储对象
一旦选择了特定操作系统,那么字节顺序也就固定下来。
1.4、表示字符串
C语言中字符串被编码为一个以null(其值为0)字符结尾的字符数组。某个字符都由某个标准编码来表示,最常见的是ASCII字符码。
在使用ASCII码作为字符码的任何系统上都将得到相同的结果,与字节顺序和字大小规则无关。因而文本数据比二进制数据具有更强的平台独立性。
1.5、表示代码
不同的机器类型使用不同的且不兼容的指令和编码方式,因此二进制代码是不兼容的。
二进制代码很少能在不同机器和操作系统组合之间移植。
1.6、布尔代数简介
布尔代数就是将逻辑值TRUE和FALSE编码为二进制值1和0,以研究逻辑推理的基本原则。
布尔运算有非、与、或、异或。
位向量就是固定长度为,由0和1组成的串。
1.7、C语言中的位级运算
C语言中的位级运算符有:
- "~" —— 非
- "|" —— 或
- "&" —— 与
- "^" —— 异或
位级运算的一个常见用法就是实现掩码运算,比如:
- 位级运算x & 0xFF生成一个由x的最低有效字节组成的值
- 位级运算~0将生成一个全1的掩码,不管机器的字大小是多少。
1.8、C语言中的逻辑运算
逻辑运算和位级运算的区别是,逻辑运算只返回1或0,分别表示结果为TRUE或FALSE。
C语言中的逻辑运算符有:
- "||" —— 或
- "&&" —— 与
- "!" —— 非
C语言中的逻辑或运算和逻辑与运算是短路运算。
1.9、C语言中的移位运算
①C语言中的左移运算
C语言的左移运算只有逻辑左