2.1信息存储
- 大多数计算机使用 8 位的块,或者字节(byte), 作为最小的可寻址的内存单位,而不是访问内存中单独的位。机器级程序将内存视为一个非常大的字节数组,称为虚拟内存。内存的每个字节对应着一个单独的地址, 所有可能地址的集合就称为虚拟地址空间。
2.1.1十六进制表示法
- 通常采用十六进制数来表示位模式。
2.1.2字数据大小
- 虚拟地址空间:内存视为的字节空间。若一个机器字节为ω,则对应的虚拟地址范围为:0~2^ω-1,程序最多访问2^ω个字节。
- 位编译,采取向后兼容,即大多数64位机器可以运行为32位机器编译的程序。
- 对于XX位程序,区别的条件是其运行的机器类型,而不是该程序具体是如何编译的。
2.1.3寻址和字节顺序
- 对于字0X01234567而言,高位字节(最高有效字节)的十六进制值为0X01,低位字节(最低有效字节)的十六进制值为0X67。
- 小端法机器:Linux 32、Windows和Linux 64
- 大端法机器:Sun
- Linux32、Windows、Sun的机器使用4字节地址,而Linux64使用8字节地址。
- 强制类型转换不会转换真实的指针,它们只是告诉编译器以新的数据类型来看待被指向的数据。
大小端存储的常见问题
- 当在不同类型的机器之间通过网络传送二进制数据时,当接收程序时会发现,字里的字节变成了反序,对于这类问题的避免,规定网络应用程序的代码必须按照建立好的字节顺序。
- 当阅读表示整数数据的字节序列时字节顺序也很重要。
2.1.4表示字符串
- 由于文本数据只有ASCII字符组成,因此文本数据比二进制数据具有更强的平台独立性。
2.1.5表示代码
- 对于不同的机器类型,其指令和编码方式也不同,因此二进制代码是不兼容的。二进制代码很少在不同的机器和操作系统之间移植。
2.1.6布尔代数简介
- 非(NOT) 与(AND) 或(OR) 异或(XOR)
- 位向量就是固定长度为ω,由0和1组成的串。
2.1.7C语言中的位级运算
- 按位布尔运算,|就是OR(或),&就是AND(与),~就是NOT(非),^就是XOR(异或)
2.1.8C语言中的逻辑运算
- 对于命题逻辑有||(OR)、&&(AND)、!(NOT),逻辑运算的返回值只有0X00和0X01两种
按位运算和逻辑运算的区别:
- 只有参数被限制为0和1时,按位运算才和逻辑运算一致。
- 如果对第一个参数求值就可以确定表达式的结果,则逻辑运算就不会对第二个参数求值。
2.1.9C语言中的移位运算
- 左移:逻辑左移和算术左移实现的功能一致,都为补0。
- 右移:逻辑右移~~~补0;算术右移~~~将最高有效位补充上。