深入理解计算机系统第二章总结
第二章总结:
主要从信息的存储讲到数的表示与数的运算,信息的存储主要讲了数字的二进制,十六进制表示,字节序列的存储。数的表示讲了有符号数和无符号数的表示以及之间的转换;数的运算讲了有符号数、无符号数的加乘除运算;最后浮点数讲了浮点数的表示与浮点数的运算,其中浮点数的规格化,非规格化,计算阶码的时候不一样。
特别注意的小知识点:
寻址都是从低到高地址的,大小端这是存储方式不一样,小端是低字节在低地址,大段是高字节在低地址。
加减法优先级要比移位运算优先级高。
表达式~0 可以获得全位1的掩码序列。
避免漏洞最好的方式就是不使用无符号数。
判断无符号数加法是否溢出的函数
-x = ~x + 1;
int uadd_ok(unsigned int x, unsigned int y) { if (x+y > y) return 1; return 0; }
判断有符号数加法是否溢出的函数
int tadd_ok(int x, int y) { int sum = x + y; int negOver = (x < 0) && (y < 0) && (sum >= 0); int posOver = (x >= 0) && (y >= 0) && (sum < 0); return (!negOver) && (!posOver); }
X乘以常数K可以优化:
假如K={Kw-1,...,Kn,...Km,Km-1,...,K0}中Kn...Km为全为1的序列,那么该段为序列对乘积的影响如下
形式A:X<<n+X<<(n-1)+......+X<<m
形式B:X<<(n+1) - x<<(m)
将所有的这样的1序列的乘积累计起来就是X*K的值。
X/2k = (x<0)? ((x+ (1<<k) -1):x) >> k;
浮点数
IEEE: V = (-1)s*M*2E;
浮点数的值分为规格化值,非规格化值以及特殊化值三种情况。
平时可能会用的函数
1、求最左边的1表示的数字
int leftmost_one(unsigned x) { x += x>>1; x += x>>2; x += x>>4; x += x>>8; x += x>>16; return x^(x>>1); }
2、求低n个位表示的数字
int lower_bits(int x, int n) { int w = sizeof(int) << 3; if(n == w) return x; return x & (2<<(n-1) - 1); }