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

3.2 了解数据类型

计算机中的每一份数据都是一条由二进制数位(binary digit)所构成的序列,其中的二进制数位也简称位(bit,音译比特)。单个的二进制位要么是0,要么是1,这两种取值分别对应于开启(on)与关闭(off)这两种状态。八个二进制位合起来构成一个字节(byte)。字节是基本的数据单元,它可以单独表示某份数据。另外,我们可以把两个字节合起来称作一个十六位的字(16-bit word),也可以把四个字节合起来称作一个三十二位的字(32-bit word),或者把八个字节合起来称作一个六十四位的字(64-bit word)。字节以及长度不同的字有下面几种用法:

□用来表示CPU的指令(以及指令所涉及的数据)。

□用来表示计算机中某份数据所在的地址。

□用来表示某份数据的值。

怎样根据C语言的语句来产生相应的二进制指令是由编译器负责的,我们无须担心。大家只要写出符合C语言语法的代码就行。

另外,我们还可以通过计算机的某个部件(或者说,某个设备)所在的地址来与这个部件相交互。但一般来说,我们用不着直接这样操作。例如,我们只需要调用printf()函数,就可以把相应的字符串打印到控制台,函数本身会设法将调用时所传入的字符串数据移动到计算机中的相关部件上,并让那个部件将这些信息显示到控制台上。我们不需要关注那个部件所在的地址,因为该地址可能会随着计算机以及操作系统的版本而变化。

当然,计算机中某些数据的地址需要由我们自己去操作,这些情况将在第13章中讲解。然而,在大多数情况下,我们不用自己处理相关的地址,因为编译器会替我们处理这些问题。

指令与地址都跟数据有关。指令用来操作并移动数据,而地址则用来告诉指令它所要获取的数据在什么地方,或者它应该把数据保存到什么地方。指令根据地址获取某份数据,然后操作它,最后把它保存到适当的地址上。

正式开始操作数据之前,我们首先必须了解数据是怎么表示的,并且要知道操作每一种类型的数据时应该注意哪些事项。

下面来看一个基本的问题。如果我们在白色的背景上用黑颜色的笔写出这样一个图案,那它表示的是什么?

单看这一个图案,或许没办法适当地做出判断,因此,我们应该把这个图案放在一系列图案中去考虑,比方说,我们把它跟下面两个图案排列到一起。在这种情况下,这个图案表示的是什么意思?

大家应该看出来了,它表示的是整数13。但是别急,如果把它跟另外两个图案放在一起,那它表示的又是什么意思?

把这两种情况合起来,就可以看出问题了。

这张图可以说是一个二维的表格,它的第二行与第二列都排了3个图案。最中间那个图案如果跟同一行左右的两个图案合起来看,那么表示的就是整数13,但如果跟同一列上下的两个图案合起来看,那么表示的则是字母B。我们必须先明确该图案所在的情境(context,也叫作语境或上下文),知道它是跟哪些图案放在一起考虑的,然后才能厘清它的含义。具体应该如何解读这个图案取决于我们把它放在哪个情境里面观察。

这个例子中的图案跟编译器所生成的字节序列很像。CPU处理这些字节序列时也需要先厘清它的含义。在计算机内部,命令、地址与数据,其实都是由1和0这两种二进制位所构成的字节序列,只不过这些序列的长度有所不同。计算机具体如何解读这样的字节序列完全取决于编程语言及使用这种语言来开发程序的人给这个字节序列所设置的情境。

因此,我们在编写程序时,必须给编译器提供相关的指导,进而让CPU明白应该怎样解读某个二进制序列。具体到C语言来说,我们必须给自己想要操作的这份数据明确指定一种类型。

C语言是强类型语言(strongly typed language),也就是说,它里面的每个值都必须与某个类型相关联。大家还应该知道,有一些语言能够依照数据的用法来推断其类型,而且在必要时会按照预设的方式把数据从一种类型转换成另一种类型。那些语言叫作弱类型语言(loosely typed language,也写成weekly typed language)。C语言虽然也能把数据从一种类型转换成另一种类型,但是跟那些语言相比,C语言的转换规则更加明确。

C语言跟大多数编程语言一样具备5种基本的固有数据类型。所谓固有,意思是说,这些类型以及它们所支持的操作是内置在编程语言里面的,而不需要由程序库、开发者自己或第三方来提供。

这5种基本的数据类型是:

整数:可以只用来表示某个范围内的正整数,也可以用来表示某个范围内的正整数及负整数。

小数:指的是位于某两个整数之间的数,比如1/2、3/4、0.79、1.125以及π的近似值3.141 59(当然也包括准确度更高的近似值,例如3.141 592 653 589 793 238 462 643 3)。这里所说的小数,包含值为负的小数。

字符:在C语言里面,字符是构成字符串的基本单位。某些编程语言会专门提供一个类型用来表示字符串,然而C语言却没有。C语言的字符串只是一种特殊形式的字符数组,这种数据类型虽然不是专为字符串而设的,但却可以用来表示连续出现的多个字符。

Boolean值(布尔值):这种值到底占据多大空间要看编译器与计算机选用什么样的方式来表示整数。

地址:指某个字节在计算机内存中的位置。C语言可以直接访问某个值在内存中的地址,这与其他的许多编程语言不同,那些语言不允许开发者直接通过地址来操作数据。

这5种类型又可以细分成多个小类型,每个小类型会采用不同的数据尺寸来支持不同的取值范围。C语言制定了一套相当具体的规则来判定怎样把一种类型的数据转换成另外一种。有些类型之间能够有效地转换,而另一些类型转换起来则没有意义。我们会在第4章详细讲解这个话题。

现在,我们需要了解基本的数据类型,以及这些类型分别能够表示多大的值。