信息的表示和处理
2.1 信息存储
大多数计算机使用8位的块,或者字节,作为最小的可寻址的内存单位,而不是访问内存中单独的位。机器级程序将内存视为一个非常大的字节数组,称为虚拟内存。内存的每个字节都由一个唯一的数字来标识,称为它的地址。所有可能地址的集合就称为虚拟地址空间
2.1.1 十六进制表示法
10进制 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2进制 | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
16进制 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
2.2.2 字数据大小
每台计算机都有一个字长,指明指针数据的标称大小。因为虚拟地址是以这样的一个字来编码的,所以字长决定的最重要的系统参数就是虚拟地址空间的大小。也就是说一个字长为ω位的机器而言,虚拟地址的范围为0~
2
ω
−
1
2^{ω}-1
2ω−1,程序最多访问
2
ω
2^{ω}
2ω个字节。
目前大多数机器从32位字长迁移到64位。
大多数64位机器也可以运行32位机器编译的程序,这是一种向后兼容。
因此:
- 以下指令编译的程序可以在32和64位机器上运行
gcc -m32 hello.c
- 以下指令编译的程序智能在64位机器上运行
gcc -m64 hello.c
2.1.3 寻址和字节顺序
对于跨越多字节的程序对象,我们必须建立两个规则:这个对象的地址是什么,以及在内存中如何排列这些字节。
排列表示一个对象的字节有两个通用的规则:
- 小端法:最低有效字节在最前面
- 大端法:最高有效字节在最前面
对于大多数应用程序员来说,其机器所使用的字节顺序是完全不可见的。无论哪种类型的机器,都会得到相同的结果。不过有时候,字节顺序会成为问题。首先是在不同类型的机器之间通过网络传送二进制数据时,就会发现字里的字节成了反序的
2.1.4 表示字符串
在使用ASCII码作为字符码的任何系统上都将得到相同的结果,与字节顺序和字大小规则无关。因而,文本数据比二进制数据具有更强的平台独立性。
现在又扩展到unicode、utf-8
2.1.5 表示代码
在不同的机器上编译同一段c代码,生成的字节表示的机器代码是不同的。不同的机器类型使用不同的且不兼容的指令和编码方式。即使完全一样的进程,运行在不同的操作系统上也会有不同的编码规则,因此二进制码是不兼容的。二进制代码很少能在 不同机器和操作系统组合之间移植。
2.1.6 布尔代数简介
与 | 或 | 非 | 异或 |
---|---|---|---|
& | | | ~ | ^ |
2.1.7 c语言中的位级运算
2.1.8 c语言中的逻辑运算
2.1.9 c语言中的移位运算
2.2 整数表示
用位来编码整数的两种不同的方式:
一种智能表示非负数,而另一种能够表示负数、零和正数。
2.2.1 整型数据类型
char、short、int、long
2.2.2 无符号数的编码
所有的位都用来表示数。
无符号数的取值范围:0~
2
ω
−
1
2^{ω}-1
2ω−1
2.2.3 补码编码
可以用来表示负数值。
在这个定义中,将字的最高有效位解释为负权,也称作符号位,即:1表示为负,0表示为非负。
取值范围自行脑补,不太好编辑,就不写了