2.2 基本数据类型
为了能将程序中指定的数据精确地用相应的内存单元来存储和操作,C语言内部预定义了一些数据类型,这些类型称为基本数据类型,其名称是内部预定义的关键字,不能另做他用,且全部是小写字母。同时,为了在程序中能直接访问内存单元,C语言还提供了指针类型。除此之外,C语言还允许用户根据基本数据类型和指针类型定义出更为复杂的数据类型,如数组、结构和联合等,用于多个或多项数据的描述。总之,C语言中的数据类型可分为基本类型、构造类型和指针类型3类,如图2.2所示。
图2.2 C语言的数据类型
注:(1)void又称无值类型,用于描述没有返回值的函数以及通用指针类型
(2)图中的type是指任意一个C语言合法的数据类型
这里,首先介绍C语言的基本类型,其他类型在以后的章节中陆续介绍。
2.2.1 整型
C语言中,用于基本整型定义的关键字是int,对于ANSI C来说,它表示int型整数的二进制码在计算机中是用2字节(16位)的连续内存单元来存储的。按照整数的机内格式,最高位用做符号位(正数为0,负数为1),其余各位为数据位。这样,int类型所指定的内存可以存储-32 768~+32 767范围的整数,或者说,int整型表示的数值范围为-32 768~+32 767。
事实上,为了更好地控制整数的范围和存储空间,C语言还允许用short(短型)、long (长型)、signed(有符号)和unsigned(无符号)关键字来区分。
(1)当short修饰int时,称为短整型,写成short int,也可省略int,直接写成short。在大多数计算机上,short表示2字节,即16位长。默认时,short的最高位是符号位,这样它能表示-32 768~+32 767范围的整数。
(2)当long修饰int时,称为长整型,写成long int,也可省略int,直接写成long。在大多数计算机上,long表示4字节,即32位长。默认时,long的最高位也是符号位,这样它能表示-2 147 483 648~+2147 483 647范围的整数。
可见,short,int和long可以分别表示不同位长的整数,如图2.3所示。注意,Visual C++ 6.0所支持的整型int为4字节,即32位(图中的虚框已标明)。
图2.3 不同整型的存储空间的大小
(3)当unsigned修饰short,int和long时,它强制使它们的符号位(最高位)也用做数据位,并与其他位一起来表示整数。这样,它们所表示的整数的最小值是0,即只能表示正整数。例如,unsigned short表示的整数范围是0~65 535。
(4)当signed修饰short,int,long和long long(此类型为C99标准补充)时,由于默认时short,int和long都是有符号的,因而此时signed可以省略。例如,signed int可省略为int。
需要说明的是:在C语言中,unsigned int可省略为unsigned,而signed int既可省略为int,也可省略为signed。
2.2.2 实型
实型又可称为浮点型。在C语言中,用于表示实型的类型名关键字有:float,double和long double。需要说明的是:ANSI C 并未规定具体的每一种实型的位长、精度和数值范围。但在大多数计算机中:
(1)float是单精度实型,用32位(4字节)来表示,其有效位数为6~7位,数值范围约为-3.4×1038~+3.4×1038。
(2)double是双精度实型,用64位(8字节)来表示,其有效位数为15~16位,数值范围约为-1.7×10308~+1.7×10308。
(3)long double是长双精度实型,可用64位(8字节)、80位(10字节)或128位(16字节)来表示,具体位长取决于C编译器对其支持情况,如图2.4所示(每个方格代表1字节,实线方格表示大多数编译器支持的字节数,虚框表示可以增加的字节数)。
图2.4 不同实型的存储空间的大小
2.2.3 字符型
在C语言中,char字符类型用于表示ASCII编码的字符,即用来存储字符的ASCII编码,它有3种不同的类型:char,unsigned char和signed char。
一般来说,用char存储小整数时,可根据需要添加unsigned或signed修饰,unsigned char可看做是0~255的正整数,signed char可看做是-128~127的小整数。若用char存储字符,则不需要任何修饰。对于没有任何修饰的char来说,char究竟有没有符号,取决于不同编译器的处理方式。事实上,大多数编译器(如Visual C++ 6.0)都将没有任何修饰的char型默认为signed char。
2.2.4 实际位长
在数据操作中,有时由于不知道C语言中的基本数据类型的实际位长,从而使数据溢出而导致计算结果的错误。因此,常需要使用下面的程序来测试。
【例Ex_DataT.C】 基本数据类型的位长测试
#include<stdio.h> #include<conio.h> int main() { printf("char -------%d byte\n",sizeof(char)); printf("short -------%d bytes\n",sizeof(short)); printf("int -------%d bytes\n",sizeof(int)); printf("long -------%d bytes\n",sizeof(long)); printf("float -------%d bytes\n",sizeof(float)); printf("double -------%d bytes\n",sizeof(double)); printf("long double -------%d bytes\n",sizeof(long double)); return 0; /* 指定返回值 */ }
分析和说明:
(1)程序中,stdio.h头文件定义的printf库函数是一个带格式的输出函数,由一对双引号括起来的字符串,称为格式字符串,其中的“%d”是将第2个实际参数(sizeof(…))的值按十进制来填充到格式字符串中的“%d”位置处,然后输出到屏幕中。
(2)sizeof是C语言的一个运算符关键字,它的使用类似于一个函数,用来获取一个表达式、类型或数组等所占内存的字节数大小。
这样,该程序在Visual C++ 6.0中运行,其运行结果如下所示:
char --------1 byte short --------2 byte int --------4 byte long --------4 byte float --------4 byte double --------8 byte long double --------8 byte
这里再来列出ANSI C中的各种基本数据类型、位长和范围,如表2.1所示。需要说明的是
(1)在表2.1的类型名中,方括号“[ ]”用来表示可以省略,本书做此约定。
表2.1 ANSI C的基本数据类型
(2)ANSI C和Visual C++ 6.0在基本数据类型上的区别为:Visual C++ 6.0中基本int类型的字节数默认为4,long double类型的字节数默认为8,而ANSI C分别为2字节和10字节。