C语言程序设计基础教程
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.1 C语言的基本数据类型

3.1.1 数据类型的产生

不同类型的数据在计算机中的存储和处理方式不同,由于计算机不能自动识别数据的类型,所以必须事先分类定义。这样计算机在遇到一个数据时,根据其所属的数据类型就可以采取相应的处理方式,这就是在计算机中引入数据类型的原因。

3.1.2 C语言的数据类型

C语言一个很重要的特点是数据类型十分丰富,因此数据处理能力很强。C语言的数据类型如图3-1所示。

图3-1 C语言的数据类型

C语言中的数据类型可以分为基本数据类型和非基本数据类型,后者也是由基本数据类型构成的。本节我们重点介绍如下3种基本类型。

1.整型

整型数据是没有小数部分的整数类型的数据,可分为基本整型、短整型、长整型和无符号型4种。

(1)基本整型:类型声明符为int。

(2)短整型:类型声明符为short int或short。

(3)长整型:类型声明符为long int或long。

(4)无符号型:存储单元中全部二进位用来存放数据本身,没有符号位。无符号型可与上述3种类型匹配而构成无符号基本整型(unsigned int或unsigned)、无符号短整型(unsigned short)和无符号长整型(unsigned long)。Visual C++ 6.0编译环境下各种整型类型所占的内存字节数及其取值范围如表3-1所示。

表3-1 Visual C++ 6.0编译环境下各种整型类型所占的内存字节数及其取值范围

从表3-1中可以看到虽然各种无符号类型所占的内存字节数与相应的有符号类型所占的内存字节数相同,但是由于省去了符号位,不能表示负数并且其最高位仍为数据位,所以取值范围不同。

需要说明的是C语言标准没有具体规定以上各种数据类型所占内存的字节数,而只要求各个类型的长度满足条件long≥int≥short。同一种类型的数据在内存中占用的字节数与以下因素有关。

(1)编译器。

在Turbo C 2.0编译环境下,int类型占两个字节;在Visual C++ 6.0编译环境下,int类型占4个字节。

(2)计算机字长(机器)。

int类型在16位计算机中占两个字节,而在32位计算机中占4个字节。

总体来说,以上各种整型数据类型实际占用的字节数与编译器的编译环境及计算机字长有关,在不确定时可使用运算符 sizeof(类型名)检测,该运算符的用法详见3.3.8节。

在C语言中整型数据可以用十进制、八进制和十六进制3种形式来表示。

(1)十进制整数:没有前缀,其数码为0~9,用+、-号表示数值的正负。例如,59、+12、-7都是正确的十进制整数。

(2)八进制整数:必须以数字0开头,数码取值为0~7。例如,024等价于十进制数20;018则是一个非法的八进制整数。

(3)十六进制整数:必须以0x或0X开头,数码取值为0~9,a~F或a~f。例如,0x1f等价于十进制数31。

注意:在程序中根据前缀来区分各种进制数,因此在书写时应小心不要把前缀弄错(十六进制的前导符0x中x前面是数字0,不是字母)。

以上任何形式的有符号整数,在计算机内部都会自动转化为二进制的补码形式存储,但是在表示一个整型数据时不能使用二进制形式。

在一个整型数据后面加上后缀、字母l或者L,则认为是长整型数据。例如,78L、 025L和0x3aL等。尽管78和78L在数值上并无分别,但C编译系统为它们分配的存储空间大小不同,这往往用于函数调用中。假设某一函数形参为long int型,则不可用78作为实参,而必须用 78L。在一个整型数据后面加上后缀字母U或者u,则认为是无符号数据。例如,0X38U。

2.实型(浮点型)

在C语言中实型也称为“浮点型”,与数学中的实数概念相同,这种数据由整数和小数两个部分组成。实型数据分为以下两种。

(1)单精度型:类型声明符为float。

(2)双精度型:类型声明符为double。

在Visual C++ 6.0编译环境下为各种实型数据类型分配的内存字节数、精度及其取值范围如表3-2所示。

表3-2 在Visual C++ 6.0编译环境下为各种实型数据类型分配的内存字节数、精度及其取值范围

在C语言中实型数据只能采用十进制,有如下两种表达形式。

(1)十进制小数:由+或-号、数字0~9和小数点组成(注意必须有小数点)。若整数部分是0,则可以省略。例如,-2.5、.7l、12.、0.0、.0、0.等都是正确的十进制小数形式(其中.71等价于0.71,12.等价于12.0,0.0等价于.0和0.)。

(2)指数(科学计数法):在计算机中用字母E(或e)表示以10为底的指数。

一般格式为anan,代表a×10±n(其中a为十进制数,n为十进制整数)。字母E(或e)后面的“+”号可以省略,E(或e)之前必须有数字,E(或e)后面的指数必须为整数。例如,12E+3或12e3代表12×103,-1.5E-7代表-1.5×10-7

注意:没有无符号的浮点数,所有浮点数都是有符号数。

所有浮点常量都被默认为double型。如有必要,可以使用后缀f或F来表示float型实数。例如,1.8E3f、1.6f、9F等。这里特别说明1.6与1.6f不同,C编译系统把1.6默认为双精度数,分配8个字节;1.6f则按单精度处理,分配4个字节。

3.字符型

字符型的类型声明符为char,可以分为有符号和无符号两种,字符型数据在内存中分配的字节数及取值范围如表3-3所示。

表3-3 字符型数据在内存中分配的字节数及取值范围

字符型用于存储字符,如英文字母或标点等。严格来说,字符型也是整数类型,因为字符数据在内存中存储的是字符的ASCII码值。例如,小写字母a的ASCII码值是97。因此实际上在计算机中存储的是整数97,而不是字符a,所以C语言允许字符型数据与整型数据通用(当然是在一定的取值范围内)。

ASCII 码对照表如表3-4所示。

表3-4 ASCII码对照表

ASCII值的范围是0~127,其中0~31及127(共33个)是控制字符或通信专用字符;32~126分配给了键盘上的键符(均为可打印字符)。

在C语言中,字符型数据有如下两种。

(1)用一对单引号括起来的单个(不能是多个)字符,例如,′A′、′n′、′*′、′6′。

(2)转义字符,以反斜杠′\′开头的特殊字符,如′\n′表示一个换行符。常用的转义字符及其含义如表3-5所示。

表3-5 常用的转义字符及其含义

说明如下。

(1)同一个字符可以有不同的表达形式,如′A′、′\101′和′\x41′均表示大写字母A;′\012′和′\xa′均表示换行符。

(2)′s′和′S′是不同的字符,大小写字母的ASCII码差值为32。

(3)′ ′、'”'和'\'都是不合法的,必须用转义字符来表示,正确表示方法为′\′,双引号"\"和反斜杠′\\′。

(4)′\0′或′\00′是代表ASCII码为0的控制字符,代表空操作,常用在字符串中。