CSAPP page49

信息存储:

大多数计算机使用字节来作为最小的可寻址的存储器单位,存储器的每个字节都由唯一的数字来标识,称为地址。

C中的指针也是一个变量,它的值是地址,它的类型是它所指向的类型。由于指针的值是地址,所以指针的大小为字长。

C中的char表示单独的一个字节,short int表示为两个字节,int为4个字节,long int的大小为机器的字长。float使用4个字节,double使用8个字节。

寻址和字节顺序:

在几乎所有机器上,多字节对象被存储为连续的字节序列,对象的地址为所使用的字节序列的最小地址。

对一个对象的字节排序有两种规则:

小端法(little endian):最低有效位在前

大端法(big endian):最高有效位在前

字符 --编码--> 数字--二进制和存储规则-->存储器的位

布尔代数:

有趣特性:

a | ~a = 1

a & ~a = 0

a ^ a = 0

a ^ ~a = 1

a ^ 0 = a

a^1 = ~a

DeMorgan's law:

~(a&b) = ~a | ~b

~(a|b) = ~a & ~b

位向量的应用:

1.有限集合,若位为1,则表示集合中包含了该位下标的值的数字;若位为0,则相反。

例如一个位向量为a=[01101001]表示集合A={0,3,5,6};位向量b=[01010101]表示集合B={0,2,4,6}。则 a|b = A并B ; a&b = A交B,而~a = A的补集。

2.掩码(masking)运算:

掩码0xFF = 000...00011111111 则x&0xFF = 由x最低有效字节组成的值,其他字节都被置为0。

~0将生成一个全1的掩码,不管机器的字长是多少,具有很强的移植性。

C中逻辑运算和位运算是完全不同的。而且逻辑运算具有短路的特性:若对第一个参数求值能确定表达式的值,那么逻辑运算符将不会对第二个参数进行求值。

移位运算:

左移:丢弃k个最高位,最低位补k个0 <<

逻辑右移:丢弃k个最低位,最高位补k个0 >>

算术右移:丢弃k个最低位,最高位补k个最高位的拷贝 >>

无符号数(unsigned)的右移必须是逻辑右移,补0

有符号数的右移大多数使用算术右移,补最高位的拷贝

posted @ 2012-02-28 22:26  孤牧  阅读(274)  评论(0)    收藏  举报