C语言学习指南:从规范编程到专业级开发
上QQ阅读APP看书,第一时间看更新

3.3 字节与数据块

C语言里面最小的数据值是1个二进制位(bit,简称位,又叫作比特)。然而位操作的开销相当大,并且许多编程问题用不到这种操作,因此,我们在本书中不会深入讲解位操作。如果你需要详细研究C语言的位操作,那么请阅读专门讨论这个话题的书籍。

C语言里面较为基础的一种数据值是字节,或者说,是由8个二进制位所构成的序列。1个字节可以有256(也就是28)种不同的取值。这些取值可以对应0~255(也就是28-1)的整数。0必须包含在这256种取值里面,除了0之外的255种取值可以跟1~255(也就是28-1)的正整数相对应,也可以跟-128~-1的负整数以及1~127的正整数相对应。总之,由值为1或0的8个二进制位所构成的字节只能有256种取值。

虽然我们在日常生活中不太需要处理多达256种取值,但这个取值数量对于计算机来说其实相当少。字节是最小的数据块(chunk of data),内存中的每个字节都有独特的地址,我们可以直接通过该地址定位到这个字节。另外,我们还用字节来表示那种由字母与数字所构成的文本(比如许多英文书籍),但是对于Unicode这种字符数量很多的文本标准来说,单个字节就显得太小了,不足以表示有可能出现的Unicode字符。我们会在第15章详细讲解ASCII字符与Unicode字符。

数据块的字节数量可以是1个、2个、4个、8个或16个。每一种尺寸的数据块其字节数量都是前一种尺寸的2倍。下面这张表格列出了这些数据块的用途。

从计算机的发展历史来看,最基本的计算单元所含的字节数一直在上升。早期比较原始的CPU所使用的整数由一个字节(也就是8个二进制位)构成,但很快就出现了16位的计算机,这种计算机能够用两个字节(也就是16个二进制位)来表示内存地址及整数值。计算机能够采用更多的字节来表示内存中的地址,同时也意味着它能够采用更多的字节来表示整数与浮点数,使得这两种数的取值范围也相应扩大。

后来,计算机需要处理比早前更为复杂的问题,因此本身的处理能力也需要扩充。于是就有了能够用4个字节(也就是32个二进制位)来表示内存地址的计算机,这种计算机也能够表示需要用4个字节来容纳的整数。20世纪90年代至21世纪初,这样的计算机很流行。

目前我们使用的桌面计算机基本上都是64位设备,它支持的内存空间相当广,而且能够处理的问题规模也很大,这样的计算机所能表示的最大数值或许比宇宙中的总原子数还多。如果你在处理某些问题时所要用到的值比这个还大,那就需要使用128位的数值了,这种数值需要用更高级、更专业的计算机来计算。

我们很少需要考虑这种跟天文数字一样大的值,但是在解决某些很庞大、很令人费解的复杂问题时,还是需要用到这种值的。这里的重点在于,各种大小的数据块都可以用适当的类型表示出来。我们要理解的是,无论数据块占用多少个字节或多少个二进制位来表示数据,它都遵循着同一套原理。

注意观察表格里面每种数据块的二进制位数,与它所能表示的最大值里面的那个指数有何关系。另外还要注意,数据块所包含的字节数都是2的整数次方,例如1(也就是2的0次方)、2(21)、4(22)、8(23)等。没有3字节、5字节或7字节的数据块。计算机不需要这些尺寸的数据块。

这张表格还显示出一条规律:数据块的常见用法跟它的大小有直接联系。在C语言里面,计算机表示整数时所优先选用的数据块大小一般跟它在表示地址时所用的大小相同。也就是说,计算机最多能用多少个字节来表示地址,它最多就能用多少个字节来表示整数。这虽然不是一条强制规则,但却是普遍的规律。

每种数据类型所占的字节数以及所能表示的取值范围会随着具体的计算机而变化。嵌入式计算机、平板电脑以及手机所采用的字节数可能跟桌面计算机与超级计算机不同。本章后面会创建一个sizes_ranges.c程序,以确认并验证你的计算机是用多少个字节来表示整数的,并给出这种类型在计算机上的取值范围。如果你要在某个新的系统上开发C语言程序,那么可以先通过这样一个工具来了解这方面的信息。