- 由于表示的精度有限,浮点运算是不可结合的(即不能使用结合律)
- 对于一个字长为w位的机器而言,虚拟地址的范围为0 ~ 2^w - 1,程序最多访问2^w个字节
- 我们将程序称为“32位程序”或“64位程序”时,区别在于该程序是如何编译的,而不是其运行的机器类型
- 某些机器选择在内存中按照从最低有效字节到最高有效字节的顺序存储对象,即最低有效字节在最前面,称为小端法;另一些机器则按照从最高有效字节到最低有效字节的顺序存储,即最高有效字节在最前面,称为大端法
假设变量x的类型为int,位于地址0x100处,它的十六进制值为0x01234567。地址范围0x100~0x103的字节顺序依赖于机器的类型:
- 布尔运算&对|有分配律,a&(b|c)=(a&b)|(a&c),同样,布尔运算|对&也有分配律。(a ^ b)^ a=b
- 确定一个位级表达式的结果最好的方法,就是将十六进制的参数扩展成二进制表示并执行二进制运算,然后再转回十六进制
- 位级运算一个常见用法就是实现掩码运算,这里掩码是一个位模式,表示从一个字中选出的位的集合。举个例子,掩码0xFF(最低的8位为1)表示一个字的地位字节。位级运算x & 0xFF生成一个由x的最低有效字节组成的值,而其他的字节就被置为0.比如,对于x=0x89ABCDEF,其表达式将得到0x000000EF。表达式~0将生成一个全1的掩码,不管机器的字大小是多少。尽管对于一个32位机器来说,同样的掩码可以写成0xFFFFFFFF,但是这样的代码不是可移植的。
- 异或0是保持不变,异或1是取反
- 逻辑右移:在左端补k个0;算术右移:在左端补k个最高有效位的值。几乎所有的编译器/机器组合都对有符号数使用算术右移;另一方面,对于无符号数,右移必须是有逻辑的
- 最常见的有符号数的计算机表示方式就是补码形式
- C语言中的有符号乘法是通过将2w位的乘积截断为w位来实现的。将一个补码数截断为w位相当于先计算该值模2^w,再把无符号数转换为补码
- 以往,子啊大多数机器上,常数乘法指令相当慢,需要10个或者更多的时钟周期,然而其他整数运算(例如加法,减法,位级运算和移位)只需要一个时钟周期。因此,编译器使用了一项重要的优化,试着用移位和加法 运算的组合来代替乘以常数因子的乘法
- 右移都是产生向下舍入的效果,所以对于结果是负数的除法用移位是不对的(正确应该向上舍入),可以采用(x + (1 << k) - 1) >> k 来达到向上舍入的效果
- 12.34=1 * 10 ^ 1 + 2 * 10 ^ 0 + 3 * 10 ^ -1 + 4 * 10 ^ -2。类似的二进制小数点向左移动一位相当于这个数被2除;二进制小数点向右移动一位相当于将该数乘2
深入理解计算机系统 —— 第二章
最新推荐文章于 2022-04-22 09:22:45 发布