CSAPP Ch2 信息的表示和处理
第二章后面部分Yale patt讲的比较清楚,因此在读第二遍的时候就没有继续总结了
信息的表示和处理
- 编译器维护着数据类型的信息,机器级程序不包含所谓的数据类型信息。
- 可以将2的幂次十进制数通过$n=i+4*j$这个公式来直接转换成十六进制数。其中$0\leq i\leq3$, 1(i=0), 2(i=1), 4(i=2), 8(i=3),可以把十六进制数写成高位是
i
对应的值,后面跟j
个0。如:$2^{11}$转换成十六进制数,$n=11=3+4\times2$,i
对应的值是8,后面跟2个0,得到的结果是0x800
大端字节序/网络字节序
: 最高有效字节在最前面;小端字节序/主机字节序
: 最低有效字节在最前面- 考虑一个$w$位的整数,其位表示位$[x_{w-1}, x_{w-2}, …, x_1, x_0]$,其中$x_0$是最低有效位。假设$w$是8的倍数,这些位就能被分组成字节,其中低有效字节包含位$[x_7, x_6, …, x_0]$。某些机器选择再内存中按照从最低有效字节到最高有效字节的顺序存储对象(按字节编址寻址)。
ISA
可以同时拥有两种以上顺序模式,如:ARM。而具体决定使用什么字节顺序由操作系统来决定。- 书中提到了
指针和数组
,想起来P&H
中提到过C语言中两者的性能差距。通过观察汇编代码可以发现,数组Loop判断越界下标需要在循环体内计算边界条件的地址,相比较于指针loop完成额外的乘法运算(花更多的指令) 强制转换(cast)
并不会改变指针的内容,只是告诉编译器
以新的数据类型
来看待转换后的数据。- 商用的Achitecture按字节编址寻址
strlen()
不计算字符串末尾的空字符;sizeof()
会计算末尾的空字符的大小ASCII
和UTF-8
编码只占用1个字节,而Unicode
占用2~4字节- C语言中对结果为负数的除法(
\
)进行的是向上舍入,对结果为正数进行的是向下舍入,总的来说(\
)是向零舍入; - 在向上舍入时在移位操作之前需要加上$2^k-1$的**偏移量(bias)**,如果低位部分超过$2^k$的一半(i.e. $2^{k-1}$),来达到除法移位操作后正数部分值加
1
的效果。根据Value box
可以想到,相当于将最终的负数结果增大了1,因此也就达成了向上取整的效果(见 2.3.7节)