2.3 C语言的数据类型
C语言的数据类型非常丰富,图2.1是C语言数据类型描述。
图2.1 C语言数据类型描述
本章只介绍C语言的基本数据类型(枚举类型除外),以及运算符和表达式,其他数据类型将在后续章节中陆续介绍。
2.3.1 整型数据
1.整型变量
整型数据是一种不含小数部分的数值型数据。与数学中的整数不同,C语言中整型数据的值域(即取值范围)由机器中数据的存储长度决定。整型变量可根据数据所占的二进制位数分为:基本整型(int)、短整型(short)和长整型(long)。同样存储长度的数据又分无符号(unsigned)数和有符号(signed)数。定义格式如下:
int i1,i2,i3; long int lv; short int sv; unsigned int uv;
其中,long int、short int、unsigned int中的关键字int可以省略。
在Visual C++ 6.0中,基本整型(int)数据在内存中占4字节,如表2.1所示。
表2.1 Visual C++ 6.0所支持的整型数据
2.整型常量
C语言中整型常量通常用十进制、八进制或十六进制三种数制来表示。
(1)十进制数形式:十进制整数表示方法与数学上的整数表示方法相同,每个数字位可以是0~9。例如:
200,−100,0
(2)八进制数形式:八进制整数在数码前加数字0(注意不是字母o)。例如:
0144(对应十进制数为:1× 82 + 4 × 81 + 4 × 80 = 100)
(3)十六进制数形式:十六进制整数在数码前加0x(注意x前的0是数字0,不是字母o)。数码除了数字0~9外,还使用英文字母a~f(或A~F)表示10~15。例如:
0xFFFF(对应十进制数为:15 × 163 + 15 × 162 + 15 × 161 + 15× 160 = 65535)
另外,在整型常量的末尾加上字母L或l,就组成了长整型常量,如981016L、0L等。
2.3.2 实型数据
1.实型变量
C语言中,带有小数点的数称为实型数,也称为浮点数。实型数的值域也受机器中的存储长度的限制,它只是数学中实数的一个子集。实型数据有:单精度实数(float)、双精度实数(double)和长双精度实数类型(long double)。它们在内存中所占的字节数及取值范围如表2.2所示。因而,实型变量也分为单精度实型变量和双精度实型变量。
表2.2 Visual C++ 6.0所支持的实型数据
单精度实型变量的定义格式如下:
float f1,f2;
双精度实型变量的定义格式如下:
double d1,d2;
单精度实型变量和双精度实型变量之间的差异表现在数据精度上。一般来讲,在同一系统中,double型变量的值的最大有效位数通常是float型的两倍。
2.实型常量
实型常量一般不分float型和double型,任何一个实型常量,既可以赋给float变量,又可赋给double型变量,它会根据变量的类型来截取相应的有效位数。
实型数据有如下两种表示形式。
(1)十进制小数形式:由数字和小数点组成,如3.14159,4.,.3,−6.5。
(2)指数法形式:指数法又称为科学计数法,它由“十进制小数”+“e(或E)”+“十进制数整数”三部分组成。例如:
3.12E−6表示3.12× 10−6
4E+3表示4× 103
.05E6表示0.05× 106
123.e−6表示123× 10−6
注意:
(1)e或E之前(即尾数部分)必须有数字,e或E后面的指数部分必须是整数。例如,6E0.2、E−2、1.25e1.5、e3都是不合法的实型常量。
(2)精度又称有效位。例如,若输入数据为12345678,由于float类型的精度是7,故只前7位有效,因而所接受的数据用指数形式表示为:0.1234567e + 8。
如果要求的精确度高,就要使用double型数据。
计算机浮点数,在内部是用二进制表示的,但在将一个十进制数转换为二进制浮点数时,会造成误差,原因是,不是所有的数都能转换成有限长度的二进制数。在编程中应尽量避免做浮点数的比较,否则可能会导致一些潜在的问题。
2.3.3 字符型数据
C语言字符型数据包括ASCII字符表中的所有字符,字符数据包括可显示字符和非可显示字符。每个字符型数据在内存中占1字节,分为一般字符类型char和无符号字符类型unsigned char。
1.字符型变量
字符型变量用来存放一个字符。定义的一般格式如下:
char c1,c2;
c1,c2即为字符型变量。
2.字符型常量
C语言中字符型常量的表示形式有如下两种。
一种是用一对单引号括起来的一个字符(注意:一定要是英文的单引号,不能是中文状态的单引号‘ ’)。例如,'A'表示大写字母A;'a'表示小写的字母a;'9'表示字符9;' '表示空格符。
另一种是用单引号括起来的由反斜杠(\)引导的一个字符或一个数字序列。
反斜杠引导的是转义字符,即反斜杠后面的字符转变成另外的意义。例如,'\n'表示“回车换行”控制。转义字符表如表2.3所示。
表2.3 转义字符表
反斜杠引导的一个数字序列也表示转义,即反斜杠后面的数值不是整数,而是用ASCII码数值表示的字符。即在“\”后面紧跟1~3位八进制数或在“\x”后紧跟1~2位十六进制数来表示相应系统中所使用的字符的编码值。使用这种方法可以用来表示字符集中的任何一个字符,特别是“控制字符”。例如,'\7'、'\07'、'\007'三个都表示响铃字符(bell),可通过显示'\007'来获得响铃声音的效果;'\101'代表字母'A'(八进制的ASCII码);'\x41'也代表字母'A'(十六进制的ASCII码);'\x61'代表字母'a'(十六进制的ASCII码)。
3.字符串常量
字符常量是用单引号括起来的一个字符。字符串常量是用双引号括起来的字符序列(0~N个字符),如"string"、"China"、"I am student"等。
字符串常量在内存中的存放:每一个字符均以其ASCII码存放,且最后添加一个“空字符”(二进制数00000000,记为NULL或\0。字符'0'在内存中存为0x30即00110000)。例如,字符串常量"CHINA"存放在内存中的情况是(6字节存储器,不是5字节):
因此,字符'a'和字符串的区别是:字符'a'只有1字节(值为97),而字符串"a"有2字节(值为97,0)。C语言中的每个字符串都是以'\0'为结束标记的。
另外,不能将字符串常量赋给一个字符变量。C语言中没有专用的字符串变量,但是可以用字符数组来存放。