1.二值信号
现代计算机存储和处理的信息以二值信号表示
这些微不足道的二进制数字,又称为位(bit),形成了数字革命的基础
2.信息存储
大多数计算机使用8位的块,或者字节(byte),作为最小的可寻址的内存单元,而不是访问内存中单独的位(bit)。
机器级程序将内存视为一个非常大的字节数组,称为虚拟内存,内存的每个字节都由一个唯一的数字来标识,称为它的地址,所有可能地址的集合就称为虚拟地址空间,这个虚拟地址空间只是一个展现给机器级程序的概念性映像。
3.指针
指针是C语言的一个重要特性。它提供了引用数据结构(包括数组)的元素的机制。
与变量类似,指针也有两个方面:值和类型。
它的值表示某个对象的位置,而它的类型表示那个位置上所存储对象的类型(比如整数或浮点数)。
4.字数据大小
每台计算机都有一个字长(word size),指明指针数据的标称大小。
因为虚拟地址是以这样的一个字来编码的,所以字长决定的最重要的系统参数就是虚拟地址空间的最大大小,也就是说,对于一个字长为w的机器而言,虚拟地址大小的范围为0~2**w-1,程序最多可访问2**w个字节。
32位字长限制虚拟地址空间为4千兆字节(4GB),约4*10**9字节,64位字长可使用的虚拟地址空间为16EB,约1.84*10**19字节。
大多数64位机器也可以运行为32位机器编译的程序,这是一种向后兼容。
5.寻址和字节顺序
对于跨域多字节的程序对象,我们必须建立两个规则:这个对象的地址是什么,以及在内存中如何排列这些字节。
在几乎所有的机器上,多字节对象都被存储为连续的字节序列,对象的地址为所使用字节中最小的地址。
排列表示一个对象的字节有两个通用规则:大端法(最高有效字节在最前面)、小端法(最低有效字节在最前面),如下图,
6.C语言中的位级运算
C语言的一个很有用的特性就是它支持按位布尔运算。
布尔运算包括:与(AND &)、或(OR |)、非(NOT ~)
返回按位运算的结果,运算的值不同,结果也不同
7.C语言中的逻辑运算
逻辑运算包括:与(AND &&)、或(OR ||)、非(NOT !)
运算时与布尔运算相似,但是布尔运算是以一个位来运算,而逻辑运算以每个运算的对象为一个单一的值(True/False)再进行运算,并返回True/False
8.C语言中的位移运算
比如位x,表示为:[x(n-1),x(n-2),...x(1),x(0)]
位左移:x<<k
[x(n2-k-1),x(n2-k-2),...0,0,0]
位右移:x>>k
[0,0,0,...x(n2-k-2),x(n2-k-1)]
第二章小结