csapp第二章 信息的处理和表示(1)
信息存储
计算机可寻址的内存单元叫字节,机器级程序将内存视为一个字节数组,称为虚拟内存。内存的每个字节由一个数字标识,该数字就是地址,所有可能地址的集合称为虚拟地址空间,这个虚拟地址空间可视为一个展示给机器级别程序的抽象,即是为程序提供的一个看上去统一的字节数组
字数据大小
计算机的字长,表明指针数据的标称大小。因为虚拟地址按照这样的一个字来编码,所以字长可以决定虚拟地址空间的最大大小。即w位的机器,虚拟地址范围是0到2的w次方减1
程序一般是向后兼容,即32位机器编译的程序,可以在32位或者64位的机器上运行 如果是在64位机器上编译的程序,就只能在64位机器上运行,我们说32位/64位程序属猴的是程序是被编译的机器类型,而不是其运行的机器类型
寻址和字节顺序
对于多字节的程序对象,需要知道对象的地址以及在内存中如何排列地址里面的字节。在几乎所有机器上,多字节的对象都被存储成连续的字节序列,对象的地址是这些字节中最小的地址。
排列一个对象的字节有两种规则。大端法和小端法,选用哪种好没有明确的规定,对于大多数程序员,机器的字节顺序完全不可见,但是由于大小端的存在,字节顺序会成为问题,比如
- 在不同类型机器之间通过网络传输二进制数据,当小端法机器生成的数据被发送到大端法机器上时,接受程序发现字节为反序的。 为了避免这种问题,网络应用程序编写规定发送方将内部转化位网络标准,接受方机器将网络标准转换位它的内部表示。 这里可以抽象出一个思想,当a——>b无法顺利直达时,可以考虑a–>c–>b 如果a–>c c–>b的花销可以更少,不失为一种很好的选择
- 检查机器级程序时,阅读会成为一个问题,自然书写的方式和机器里面的字节顺序相反不利于阅读
- 当编写规避正常的类型系统的程序时,如c语言中的强制类型转换,可以允许一种数据类型引用一个对象,但是这个数据类型和创建这个对象时定义的类型不同。即使这种编码技巧对于系统级编程却是必要的。
c中字符串被编码成一个以null(值为0)字符结尾的字符数组