C语言是一门编程语言。编程要解决实际的问题,而解决实际问题的第一步是要将数据保存到计算机中。比如做一个图书管理系统,那么首先要将所有图书的信息保存到计算中。再比如做一个人事管理系统,那么首先要将所有人的信息全部保存到计算机中。所以编程的第一步是数据的存储,而存储数据首先要对数据进行分类,如数学中有整数、实数、有理数、无理数、字符。每一种分类里面还可以划分得更详细。C语言里面也是一样的,也需要对这些数据进行分类,但C语言里面没有有理数和无理数。
C语言中“常用数据”的分类如图5-1所示。其他不常用或不常见的就不列出来了,比如“共用体”和“枚举”。“共用体”早就被淘汰,所以我们不讲。“枚举”用得也不多,几乎用不到。
图5-1 数据类型的分类
本节主要介绍基本数据类型。那么这些类型的数据是怎么保存到计算机中的呢?就是通过变量。变量是存储数据的容器。存储什么类型的数据就需要定义什么类型的变量。关于变量后面会详细地讲,这里大家先暂时这样简单理解一下。
数学中我们称小数叫实数,而在C语言中换了一个名字,叫浮点数,但意思与实数是一样的。
C语言中的整数和数学中的整数是一样的。但C语言中根据整数的大小,存储整数的变量的类型又分为基本整型、短整型和长整型。基本整型简称整型,用int表示;短整型用short int表示;长整型用long int表示。长短表示变量所能存储的整数的大小。比如short int能存储2字节的数据、int能存储4字节的数据、long int能存储8字节的数据。那为什么要这么麻烦分成short int、int和long int呢?全部放在long int里面不就行了吗?这个涉及内存使用的问题。内存和硬盘相比容量是很小的。所以在编程的时候一定要考虑“内存节约”的问题。比如存储数字10只需要用2字节的short int就够了,而如果用8字节的long int就会很浪费。所以C语言就划分了多种长度的数据类型,使用原则就是节约内存。即能用short int的就不要用int,能用int的就不要用long int。
此外只有int型才有long和short区分,所以对于long int和short int,可以省略int而直接写成long和short,系统自动识别为long int和short int。下面写一个程序:
# include <stdio.h> int main(void) { short i = 10; printf("%d\n", i); return 0; }
此外,int、short、long按正负又可分为有符号型(signed)和无符号型(unsigned)。有符号型表示定义的变量既可以存放正整数,也可以存放负整数。无符号型表示定义的变量只能存放正整数,不能存放负整数。通常定义的整型变量默认是有符号型的,所以signed可以省略。但是如果要将变量定义为无符号型的,那么就必须要加上unsigned。如unsigned int、unsigned short、unsigned long。但是同样,只有int型才有unsigned,所以unsigned int也可以省略int而直接写成unsigned。
下面有一个问题:我们怎么知道图5-1中所标的基本数据类型的字节数是不是正确的呢?因为不同的操作系统为同一数据类型分配的字节数是不同的,这主要取决于操作系统是多少位的。有人说int是2字节的,有人说int是4字节的,那么int到底是多少字节呢?在C语言中有一个关键字叫sizeof,它的用法是:
sizeof (对象)
它的功能是“求出对象在计算机内存中所占的字节数”。对象可以是定义好的变量名、数组名或直接是数据类型。如果是变量名或数组名,那么可以不加括号,但与sizeof之间必须要用空格隔开;如果是数据类型,那么必须用括号括起来。
这里需要注意的是,sizeof是C语言里面的关键字,不是函数,所以也没有头文件。下面编一个程序看看系统给每个数据类型分别分配了多少字节的存储空间,笔者的计算机是32位的。
/* 时间:2015年2月8日14:36:07 功能:系统给每个数据类型分别分配了多少字节的空间 */ # include <stdio.h> int main(void) { int a; short int b; long int c; float d; double e; char f; printf(" int = %d\n", sizeof(a)); printf("short int = %d\n", sizeof(b)); printf(" long int = %d\n", sizeof(c)); printf(" float = %d\n", sizeof(d)); printf(" double = %d\n", sizeof(e)); printf(" char = %d\n", sizeof(f)); return 0; } /*在VC++ 6.0中的输出结果是: -------------------------------------- int = 4 short int = 2 long int = 4 float = 4 double = 8 char = 1 -------------------------------------- */
前面介绍long int是8字节的,而笔者的计算机却只给它分配了4字节,所以大家在编程之前一定要看一下每个数据类型分别分配了多少字节的存储空间。
上面这个程序中对象用的是“变量名”,也可以直接用“数据类型”,结果是一样的:
/* 时间:2015年3月3日14:31:37 功能:系统给每个数据类型分别分配了多少字节的空间 */ # include <stdio.h> int main(void) { printf(" int = %d\n", sizeof(int)); printf("short int = %d\n", sizeof(short int)); printf(" long int = %d\n", sizeof(long int)); printf(" float = %d\n", sizeof(float)); printf(" double = %d\n", sizeof(double)); printf(" char = %d\n", sizeof(char)); return 0; } /*在VC++ 6.0中的输出结果是: -------------------------------------- int = 4 short int = 2 long int = 4 float = 4 double = 8 char = 1 -------------------------------------- */