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
有符号数的右移大多数使用算术右移,补最高位的拷贝
浙公网安备 33010602011771号