信息存储
大多数计算机使用8位的块,或者字节(byte),作为最小的可寻址的内存单位,而不是访问内存中单独的位。机器级程序将内存视为一个非常大的字节数组,称为虚拟内存。内存的每个字节都由一个唯一的数字来标识,称为它的地址,所有可能地址的集合就称为虚拟地址空间。顾名思义,这个虚拟地址空间只是一个展现给机器级程序的概念性映像。实际的实现是将动态随机访问存储器(DRAM)、闪存、磁盘存储器、特殊硬件和操作系统软件结合起来,为程序提供一个看上去统一的字节数组。
十六进制表示法
一个字节由八位组成。在二进制表示法中,它的值域是0000 00002~1111 11112。如果看成十进制整数,它的值域就是010~25510。两种符号表示法对描述位模式来说都不是非常方便。二进制法太冗长,而十进制表示法与位模式转化很麻烦。代替的方法时,以16位基数,或者叫做十六进制数,来表示位模式。十六进制(简写为“hex”)使用数字0~9以及字符A~F来表示十六个可能的值。图1-1展示了十六个十进制数字对应的十进制值和二进制值。用十六进制书写,一个字节的值域为0016~FF16。
图1-1 十六进制法。每个十六进制数字都对十六个值中的一个进行了编码
在C语言中,以0x或0X开头的数字常量被认为是十六进制的值。字符A~F既可以大写也可以小写,甚至可以大小写混合。比如FA1D37B16可以写作0xFA1D73B、0xfa1d37b又或者0xFa1D37b。
字数据大小
每台计算机都有一个字长,指明指针数据的标称大小。因为虚拟地址是以这样的一个字来编码的,所以字长决定的最重要的系统参数就是虚拟地址空间的最大大小。也就是说,对一个字长为w位的机器而言,虚拟地址的范围为0~2w-1,程序最多访问2w个字节。
大多数64位机器也可以运行32位机器编译的程序,这是一种向后兼容。因此,举例来说,当程序prog.c用如下伪指令编译后:
# gcc -m32 prog.c
该程序就可以在32位或64位机器上正确运行。另一方面,若程序用下述伪指令编译:
# gcc -m64 prog.c
那就只能在64位机器上运行。因此,我们将程序称为“32位程序”或“64位程序”时,区别在于该程序是如何编译的,而不是其运行的机器类型。
计算机和编译器支持多种不同方式编码的数字格式,如不同长度的整数和浮点数。比如,许多机器都有处理单个字节的指令,也有处理表示为2字节、4字节或者8字节整数的指令,还有些指令支持表示为4字节和8字节的浮点数。
图1-2 基本C数据类型的典型大小(以字节为单位)。分配的字节数受程序是如何编译的影响而变化。
C语言支持整数和浮点数的多种数据格式。图1-2展示了为C语言各种数据类型分配的字节数。有些数据类型的确切字节数依赖于程序是如何被编译的。我们给出的是32位和64位程序的典型值。整数或者为有符号的,即可以表示负数、零和正数;或者为无符号的,即只能表示非负数。C的数据类型char表示一个单独的字节。尽管“char”是由于它被用来存储文本串中的单个字符这一事实而得名,但它也能被用来存储整数值。数据类型short、int和long可以提供各种数据大小。即使是为64位系统编译&#x