2.1 信息存储
- 虚拟内存:机器级程序将内存视为一个非常大的字节数组
- 内存地址:内存的每个字节都有一个唯一的数字来标识
- 虚拟地址空间:所有内存的可能地址的集合
2.1.1 十六进制表示法
- 作用:描述位模式
- 优点:相对于二进制较简短;相对于十进制,与各进制转换较容易
2.1.2 字数据大小
- 字长:指明指针数据的标称大小,字长决定的最重要的系统参数就是虚拟地址空间的大小
- ISO C99引入了一类数据类型,其数据大小是固定的,不随编译器和机器设置变化
2.1.3 寻址和字节顺序
对于跨越多字节的程序对象,需要明白这个对象的地址是什么,已经在内存中如何排列这些字节
-
多字节对象都被存储为连续的字节序列,对象的地址为所使用的字节中的最小的地址
-
内存中排列字节的方式有大端法和小端法两种
- 大端法:最高有效字节在最前面
- 小端法:最低有效字节在最前面
2.1.4 表示字符串
- C语言中字符串被编码为一个以null(其值为0)字符结尾的字符数组。每个字符都有某个标准编码来表示
- 文本数据比二进制数据具有更强的平台独立性
2.1.5 表示代码
- 二进制代码很少能在不同机器和操作系统组合之间移植
2.1.6 布尔代数简介
- 布尔代数:通过将逻辑值TRUE和FALSE编码为二进制值1和0设计出来的一种代数方式
- ~:NOT 非真即假
- &:AND 当且仅当P和Q都为真时,P&Q才为真
- |: OR 一真即P|Q为真
- ⊕:EXCLUSIVE-OR 当P或Q为真且不同时为真时,P⊕Q为真
- 位向量:由固定长度为⍳的0和1组成的串
- 位向量的运算:参数的每个对应元素之间的运算
2.1.7 C语言中的位级运算
- 常见用法:掩码运算
2.1.8 C语言中的逻辑运算
- ||
- &&
- !
2.1.9 C语言的移位运算
- 左移:向左移动x位,丢弃最高的x位,并在有段补发x个0
- 逻辑右移:同左移相同
- 算术右移:将A的二进制表示的每一位向右移B位,右边超出的位截掉,左边不足的位补符号位的数。
- 引用:JAVA 和 Python中:算术右移 A >> B , 逻辑右移 A >>> B
A = 11111111111111111111111110000001
B = 2
A >> B = 11111111111111111111111111100000
A >>> B = 00111111111111111111111111100000
2.2 整数表示
2.2.1 整型数据类型
- 对比以上图片可知C语言的整数数据类型的保证的取值范围保证了32位的整数数据可以在64位的计算机上正常发挥作用
2.2.2 无符号数的编码
- 具有唯一性
2.2.3 补码编码
- 补码:最高有效位解释为负权,0为非负,1为负
- 不难看出,负值的绝对值比正值大1,这也就可以解释前面的各个类型取值范围了
2.2.4 有符号数和无符号数之间的转换
- 对于大多数C语言的实现来说,这个转换都是从位级角度来看的,即位不变,位转换为数的方式变了
- C语言中当执行一个运算时,如果它的一个运算数是有符号的而另一个是无符号的,那么C语言会隐式地将有符号参数强制类型转化为无符号数,并假设这两个数都是非负的
2.2.5 扩展一个数字的位表示
- 无符号数与有符号数(非负)的扩展都为零扩展,即在表示的开头添加x位0
- 有符号数(负)的扩展位"1"扩展,即在表示的开头添加x位1
- 从一个数据大小到另一个数据大小的转换,以及无符号和有符号数字之间的转换的相对顺序能够影响一个程序的行为,例如:
- 当把short转换成unsigned时,需要先改变大小,之后再完成从有符号到无符号的转换
2.2.6 截断数字
- 截断:将一个w位的数字截断为一个较短的k位数字丢弃高w-k位
-
无符号数溢出:为原来数字
-
有补码数溢出:负值
2.3整数运算
2.3.1 无符号加法
2.3.2 补码加法
2.3.3 无符号和补码乘法
未完待续