3.6 变量类型的进一步讨论
第2章已经介绍了int 、float和char 变量类型。但是在实际编程工作中,int型的取值范围和float型的精度很可能满足不了应用的需要,下面再介绍三种新的基本变量类型。
(1)double类型
如果float 类型变量的精度达不到在应用中的要求(精度超过6位、取值范围不够大或者不足够接近0),那么可以使用double型变量。
虽然C语言标准没有规定double型变量的取值范围和精度,但是IEEE 754标准规定:double型变量的上下限取值范围是–1.79×10308~1.79×10308之间,double型变量可以表示的最接近0值的正负数是±2.22×10–308,精度在通常的PC上(不论你使用的是Windows还是Linux操作系统)可达十进制的15个数字(IEEE 754标准规定的double型的精度是10位)。大多数计算机制造商都遵守这个规范标准。
double型变量在输入时,使用格式符%Lf(或%lf);而在输出double型变量时,使用格式符%f(而不是%Lf)。
注意:double 型变量在调用scanf()库函数时,要用%Lf (或%lf)与之匹配。不要用%f。
double型变量在调用 printf()库函数时,要用%f与之匹配。不要用%lf。
记忆口诀:输出(即output)时,double 像 float (都有output中的o)。
(2)long int 类型(可简写为long)
如果int 型变量在你所用的编译环境下取值范围不够大(比如在–32768~32767之间),而你又不想使用取值范围更大但有一些缺陷的float型(或double型)变量,则可以使用长整型long int (简写为long)。long 型的通常取值范围是在–2147483648~2147483647之间(大约在正负21亿之间)。
long 型变量在调用格式化输入输出库函数时,要用%Ld (或%ld) 与之匹配。
但是在通常的32位系统中,int型与long型的取值范围通常是一样大的,都在–2147483648~2147483647之间,在这种系统中使用long与int型变量没有什么区别。
延伸与拓展:如果long int的取值范围在应用中还是不够大,通常有两种选择:
1)用支持新的C99标准的C编译器。其中的long long int 类型是64位长整数类型。取值范围在–263~263–1之间,格式符要用%LLd。
2)用后面将要学到的字符数组。
(3)short int 类型
short int 类型就是短整型,可以简写为 short 。C89标准只规定了 int型变量的取值范围必须大于或等于short型变量的取值范围。只有在short型变量分配的字节数少于int型变量的情况下(比如在通常的32位系统中,short型变量占2个字节内存,而int型变量占4个字节内存),在程序中使用short类型变量,才能起到节省内存空间的作用。
short类型变量在使用中更容易发生溢出(超出short的通常取值范围,即从–32768~32767),所以编程时要小心,不要因为节省一点点内存空间而使数据产生溢出。
在调用格式化输入输出库函数输入输出short型的值时,需使用的格式符是%hd。
(4)C89标准规定的全部整型变量类型
上述整型类型short、int、long 所定义的变量,取值都是可正可负的,所以都是有符号(signed)整型。各种整型类型又有对应的无符号(unsigned)整型:
与short对应的无符号短整型:unsigned short
与int对应的无符号整型:unsigned int
与long对应的无符号长整型:unsigned long
所有无符号整型变量的(正数的)取值范围,都比所对应的有符号整型变量的正数取值范围大一倍。这是由于有符号整型要用一半数来表示负整数的缘故,细节参见本章提高部分。
(5)C语言中所有变量类型的分类
C语言中的变量类型如图3-6所示。
(7)溢出问题
如果存入变量中的值超出了变量的取值范围,称为发生了溢出。出现整数溢出时,程序通常会继续运行,但所得结果是错误的。如果出现浮点数溢出(包括将一个浮点运算结果赋值给一个整型量产生的溢出)的话,将产生未定义的行为。因此,编程者必须确保所有表达式的值在运行时都在合理的取值范围内。
延伸与拓展:溢出导致的后果
把超出变量允许范围的值赋值给变量,如果值是整型并且变量是无符号型,那么会直接丢掉超出部分的高位数;如果变量是有符号型,那么结果值将由编译器决定的(C语言标准将此交给具体的编译器自行决定);而把一个太大的浮点型数赋给一个整型变量或浮点型变量的话,这两种变量都会因为取值范围太小而无法承受,从而产生未定义的行为,此时任何事情都有可能发生,包括程序终止。