深入理解计算机系统(3)-- 信息存储
大多数计算机使用字节作为最小的可寻址的存储器单位,而不是在存储器中访问单独的位。计算机级程序将存储器视为一个非常大的字节数组,称为虚拟存储器。存储器中的每个字节由唯一的一个数字标识,称为地址。所有可能的地址集合称为虚拟地址空间。
字长
对于字长,说法并没有那么明确,不必太纠结于这个问题,可以参考这个链接:
计算机系统内的字长到底指什么?
寻址和字节顺序
在几乎所有的机器上,字节对象都被存储为连续的字节序列,对象的地址为所使用字节中最小的地址。例如一个int类型变量a地址为0X100,那么a的4个字节将被存储在0X100、0X101、0X102、0X103的位置。
小端法:最低有效字节在前面
大端法:最高有效字节在前面
举例说明,变量a类行为int,地址为0X100,值为0X01234567.一共四个字节。如图所示
表示字符串
每个字符都是由某个标准编码来表示,最常见的是ASCII字符码。在使用ASCII码作为字符码的任何系统上都将得到相同的结果,与字节顺序和字大小无关;所以文本数据比二进制数据有更强的平台独立性。
不同的机器类型使用不同且不兼容的指令和编码方式。即使是完全相同的进程运行在不同的操作系统上也会有不同的编码规则,因此二进制代码是不兼容的。二进制代码很少能在不同的机器和操作系统的组合之间移植。
位运算
与(&)
或(|)
非(~)
异或(^)
逻辑运算
区别于位运算 例如,0X41(65)
逻辑与(&&):0X41 && 0X11 = 0X01
逻辑或(||):0X41 || 0X11 = 0X01
逻辑非(!):!0X41 = 0X00, !!0X41 = 0X01
逻辑运算一个重要特点是,当逻辑运算符的第一个参数可以确定表达式的值时,表达式不会对第二个参数进行运算。例如a&&5/a不会造成除零,p&&*p++不会出现引用空指针错误。
移位运算
左移:x<<k。x向左移动k位,并丢弃最高的k位,右端补0。x<<j<<k等价于(x<<j)<<k。
右移:x>>k。x向右移动k位,分为逻辑右移和算数右移。对于逻辑右移,丢弃最低k位,在左端补k个0;对于算数右移,丢弃最低k位,左端补k个最高有效位的值。看下图的例子
有些高级语言中对如何右移进行了区分,比如java,逻辑右移用“>>>”表示,算数右移用“>>”表示。
同时应注意,移位量k应当小于被操作数的位长。