深入理解计算机系统第二章总结

第二章总结:

      主要从信息的存储讲到数的表示与数的运算,信息的存储主要讲了数字的二进制,十六进制表示,字节序列的存储。数的表示讲了有符号数和无符号数的表示以及之间的转换;数的运算讲了有符号数、无符号数的加乘除运算;最后浮点数讲了浮点数的表示与浮点数的运算,其中浮点数的规格化,非规格化,计算阶码的时候不一样。

特别注意的小知识点:

寻址都是从低到高地址的,大小端这是存储方式不一样,小端是低字节在低地址,大段是高字节在低地址。

加减法优先级要比移位运算优先级高。

表达式~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);
}

 

posted @ 2015-03-14 12:01  amongv587  阅读(141)  评论(0编辑  收藏  举报