位指的是二进制系统中的一位,它是最小的信息单位。位的用处可以从两方面去分析:第一,计算机对位的值可以有任意多种解释,例如表示"yes’’或"no”,或者表示磁盘是否已插入驱动器,或者表示某个鼠标键是否被按下;第二,将若干位的值连接起来后,就可以表示更复杂的数据,而且每增加一位,可以表示的可能的值的数目就会增加一倍。
换句话说,一位可以表示两种可能的值,即“O”和“1”;两位可以表示2×2或4种可能的值,即“00”,“01”,“10”和“11”;类似地,三位可以表示2×2×2或8种可能的值……。对计算机来说,位的这种特性既是最有力的支持——因为很复杂的数据(例如本书内容)可以被分解为位的表示后存储起来,又是最大的限制——因为在现实生活中许多事物的值是不精确的,这样的值无法用数目有限的若干位来表示。
程序员始终必须清楚每一项数据需要用多少位来表示。因为位作为单位太小,所以为了方便起见,大多数计算机所处理的信息单位是被称为字节的位块。字节是大多数计算机中最小的可寻址的信息单位,这意味着计算机给每一个字节的信息都赋予一个地址,并且一次只能存取一个字节的信息。一个字节中的位的数目可以是任意的,并且在不同的计算机中可以不同。最常见的情况是每个字节中有8位,即可以存放256个不同的值。8位这样的长度非常适合于存放表示ASCII(the American Standard Code for Information Interchange)字符的数据。
下述程序可以显示空格符以后的ASCII字符和PC机的图形字符集:
#include <stdio.h>
main()
{
/* Display ASCII char set */
unsigned char space = ' '; /* Start with SPACE char = 8 bits only */
int ctr = 0;
printf(" ASCII Characters\n" );
printf (" = = = = = = = = = = = = = = = =\n" );
for (ctr = 0; ctr + space <256; ctr++ )
printf("%c", ctr + space);
printf ("\n");
}
请注意,变量ctr必须是int类型,而不能是char类型,因为char类型只含8位,只能存放从0至255之间的值(signed char类型只能存放从-128至127之间的值)。如果ctr是char类型,它就永远不会存放256或比256更大的值,程序也就永远不会结束。此外,如果你在非PC机的计算机上运行上述程序,那么程序所打印的非ASCII字符可能会导致乱屏。
因为计算机是以字节块的方式工作的,所以大多数程序也以这种方式工作,有时,考虑到要存放的数据项的数目,或者移动每一位的信息所需的时间,节省内存空间就显得很有必要。这时,我们通常会用少于一个字节的空间来存放那些只有少数可能值的数据,这也就是本章要讨论的主要内容。