Computer System a Programmer’s Perspective
《深入理解计算机系统》读书笔记
作 者:starshift 版 本:.v1.0 开始时间:2006.11.30 结束时间:未知 备 注:本文可以自由转载,引用,但请注明原作者和出处。 |
原文:Computer System a Programmer’s Perspective by Randal E.Bryant David O’Hallaron
|
第一章 计算机系统漫游
第二章 信息的处理和表示
习题2.1
完成下面的数字转换:
A, 将0x8F7A93转换为2进制
0x 8 F 7 A 9 3
1000 1111 0111 1010 1001 0011
B, 将2进制1011 0111 1001 1100 转化为十六进制
1011 0111 1001 1100
B 7 9 C
C,将0xC4E5D转换为二进制
0x C 4 E 5 D
1100 0100 1110 0101 1101
D, 将2进制转换为16进制 11 0101 1011 0111 1110 0110
11 0101 1011 0111 1110 0110
3 5 B 7 E 6
2.1.2 字
每台计算机都有一个字长(word size),指明整数和指针(注意还有指针)数据的标称大小(nominal size)。因为虚拟地址也是以这样的字编码的,所以字长决定了重要的系统参数也就是虚拟地址空间的最大值。对于一个字长为n的计算机系统而言,虚拟地址的范围是0~2n-1程序最多访问2n 字节,现在大多数的计算机字长为32,也就是程序的最大虚拟空间为4GB。
2.1.3数据大小
C语言数据类型的大小(以字节为单位)
Char 1
Short int 2
Int 4
Long int 4
Char * 4 指针长度一般为一个字长
Float 4
Double 8
2.1.4寻址和字节顺序
寻址要解决的问题是:对象的地址是什么和我们在存储器中如何对这些字节进行排序。在几乎所有的机器上,多字节对象都会被存储为连续的字节序列,对象的地址使用序列中最小的地址。Eg。int变量x的地址为0x100,那么0x100,0x101,0x102和0x103也都是存储x的空间。
字节排列顺序的小端法和大端法:
有一个16进制的数为0x01234567,地址范围是0x100~0x103,那么
大端法:
0x100 0x101 0x102 0x103
01 23 45 67
小端法
0x100 0x101 0x102 0x103
67 45 23 01
注意:在这里字内的顺序是不变的。仍然是67 45 23 01
通常而言,机器内部采用何种编码形式是不会影响到系统的内部运行的。但是,当在网络中传送数据时,不同的机器需要统一的标准进行数据传输,因此拥有已经建立的字节顺序标准。
字符顺序发生改变的第二种情况是当阅读表示整数数据的序列时,这通常发生在检查机器级程序时,eg:
80438bd: 01 05 64 94 04 08 add %eax, 0x8049464
前面的部分是由反汇编器生成的,注意到这行的十六进制字节串 01 05 64 94 04 08是一条指令的字节级表示,这条指令的意思是增加一个字节的数据宽度到地址0x8049464上,如果我们取出字节表示的最后四个字节:64 94 04 08,按照反向排序的话,将得到08049464,就是右边写着的数值。当小端法机器生成机器级表示程序时,通常也会将字节按照相反的方向表示。