信息存储
虚拟内存:非常大的字节数组。物理上并不是真实存在的,仅是展现给机器级程序的概念性。
内存地址:内存的每个字节都由唯一的数字来标识。
程序本身是一个字节序列。
十六进制表示
十进制转十六进制:
字数据大小
字长:通常说一个64位的机器,就是指这个机器的字长为64位。字长决定了虚拟地址的范围, 因为虚拟地址是以指定长度的字来编码的。一个字长为 w w w 的机器,虚拟地址范围为 0 2 w − 1 0 ~2^w-1 0 2w−1
大多数64位机器也可以运行为32位机器编译的程序,这是一种向后兼容。
(也就是说64位机器运行的不一定是“64位程序”,还要看程序的编译方式)
寻址和字节顺序
字节是最小的可寻址内存单元
多字节对象被存储为连续的字节序列,其地址为所使用字节中最小的地址
(比如,上图中变量 x 的地址为 0x100)
字符串表示
字符串 “18213” 的 ASCII 字符码,以 null (00) 字符表示结尾。
Sun 是大端法,IA32 是小端法。可以看出使用ASCII码作为字符码在任何系统上都得能得到相同的结果,与字节顺序和字大小无关。 文本数据比二进制数据具有更强的平台独立性
ASCII是单字节编码。如果是多字节会有这么好的平台独立性吗?
代码表示
二进制代码并不兼容
布尔代数
C语言中的位运算
C语言中的逻辑运算
C语言中提供逻辑运算符 ||、&&、! 分别对应命题逻辑的 OR、AND 和 NOT运算。
与位级运算的区别:
1、逻辑运算认为所有非0的参数表示真,0表示假
2、逻辑运算返回结果为 0 或1
移位运算
C/C++中的移位运算:
逻辑右移补0,算数右移补原来的最高位。对于无符号数,一定是逻辑右移;有符号数,编译器几乎使用算术右移。在Java中,>>表示算术右移,>>>表示逻辑右移。
- 移位运算是可结合的
- 移动 k (k>=w) 位时,编译器实际上执行的移位指令只考虑了 k mod w 位。
- 优先级小于加法/减法