0 基础概念及摘要
(1) 基础概念:
现代计算机存储和处理的信息以二进制信号表示 —— 0 | 1, 是非有无、非黑即白, 代表计算机是精确的.
计算机的表示法是 **用有限数量的位(bit)来对一个数字编码, 如果数字太大难以表示时, 某些运算就会 溢出(overflow).
数字有三种表示形式:
a) 无符号(unsigned) 编码: 表示大于或等于0的数字;
b) 补码(two's-complement) 编码: 表示有符号整数(可以为正或为负的数字)的最常见方式;
c) 浮点数(floating-point) 编码: 表示实数的科学计数法的、以2为基数的版本.
整数运算和浮点数运算有不同的数学属性 —— 他们处理数字表示有限性的方式不同:
整数的表示虽然只能编码一个相对较小的数值范围, 但这种表示是精确的;
浮点数虽然可以编码一个较大的数值范围, 但这种表示只是近似的.
1 信息存储
大多数计算机使用8位(bit)的块, 或者 字节(byte), 作为最小的可寻址的内存单位, 而不是访问内存中单独的位.
内存的每个字节都由一个唯一的数字来标识 —— 这个数字称为 地址(address), 所有可能的地址的集合称为 虚拟地址空间(virtual address space) —— 逻辑概念、概念性映像.
1.1 十六进制表示法
一个字节由8位组成, 在二进制表示法中, 它的范围(值域)是 00000000 ~ 11111111, 对应十进制的 0~255.
为了避免二进制表示法的冗长, 同时兼顾方便与位之间的转换, 我们用 十六进制(hexaecimal) 来表示位模式, 一个字节的范围是 0x00 ~ 0xFF.
(1) 十六进制表示法:
十六进制 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
十进制 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
二进制 | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 |
十六进制 | 8 | 9 | A | B | C | D | E | F |
二进制 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
十进制 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
说明: 在C语言中, 以0x或0X开头的数字常量被认为是十六进制的值.
字符‘A’ ~ ‘F’既可以是大写, 也可以是小写.
(2) 进制间的转换:
如0x7AF转换为十进制:
7 * 16 ^ 2 + 10 * 16 + 15 * 1 = 1967
其中7在第2位, A在第1位, F在第0位, 所以分别乘16^i次方.
而1967转换为十六进制:
1967 / 16 = 122 --- 余15
122 / 16 = 7 --- 余10
7 / 16 = 0 --- 余7
将最后的余数倒序排列, 得到的就是结果: 0x7AF.
1.2 字数据大小
每台计算机都由一个 字长(word size), 指明指针数据的标称大小(nominal size) —— 虚拟地址就是以这样的一个字来编码的, 所以字长决定了系统的虚拟地址空间的最大大小:
32位字长限制虚拟地址空间为4千兆字节(写作4GB), 刚超过410^9;
64位字长限制虚拟地址空间为16EB, 大约是1.8410^19.
基本C数据类型的典型大小:
有些数据类型的确切字节数依赖于程序是如何被编译的.
程序有“32位程序”或“64位程序”之分, 区别在于该程序是如何编译的, 而不是其运行的宿主机器类型.
ISO C99 引入了一类数据类型, 其大小是固定的, 不随编译器和机器的设置而变化, 其中就有数据类型
int32_t
(4个字节)和int64_t
(8个字节).使用确定大小的整数类型是开发人员准确控制数据表示的最佳途径. 开发人员应该力图使程序在不同的机器和编译器上可移植, 移植性的一个方面就是 使程序对不同数据类型的确切大小不敏感.
1.3 寻址和字节顺序
对跨越多字节的程序对象, 必须明确两个规则:
- 对象的地址是什么?
- 在内存中如何排列这些字节?
有些机器选择在内存中从最低有效字节到最高有效字节的顺序存储对象, 称为小端法(little endian);
有些机器则恰恰相反: 最高有效字节 -> 最低有效字节, 称为大端法(big endian).
以int类型的变量x为例, 它的十六进制值为 0x01234567, 地址范围0x100~0x103的字节顺序依赖于机器的类型:
扩展:
大多数Intel兼容机都只用小端模式, 而IBM和Oracle的大多数机器则用大端模式.但有些IBM和Oracle制造的PC使用的是Intel兼容的处理器, 因此使用小端法.
尽管有些较新的微处理器是双端法(bi-endian), 可实际情况是: 一旦选定了操作系统, 那么字节顺序也就随之固定下来, 大端法与小端法不能同时存在.
未完待续...