C语言 — 基本数据类型
1.1 数据:数据类型关键字
K&C给出了7个与类型相关的关键字。C90标准添加了2个关键字,C99标准又添加了3个关键字。
K&C给出的关键字 | C90标准添加的关键字 | C99标准添加的关键字 |
int | signed | _Bool |
long | void | _Complex |
short | _Imaginary | |
unsigned | ||
char | ||
float | ||
double |
在C语言中,用int关键字来表示基本的整数类型。后3个关键字(long,short和unsigned)和C90新增的signed用于提供基本整数类型的变式,例如unsigned short int 和 long long int。char关键字用于指定字母和其他字符(如,#,¥,%和*)。另外,char类型也可以表示较小的整数。float,double和long double表示带小数点的数。_Bool类型表示布尔值(true或false),_Complex和_Imaginary分别表示复数和虚数。
按计算机的存储方式可分为两大基本类型:整数类型和浮点数类型。
1.2 int类型
int类型是有符号整型,即int类型的值必须是整数,可以是正整数,负整数或零。其取值范围依计算机系统而异。一般而言,储存一个int要占用一个机器字长。因此,早期的16位IBM PC兼容机使用16位来储存一个int值,其取值范围是 -32768~32767。目前的个人计算机一般是32位,因此用32位储存一个int值。
1 #include <stdio.h> 2 void main(void){ 3 4 int ten = 10; 5 int two = 2; 6 7 printf("Doing it right: "); 8 printf("%d minus %d is %d\n",ten,2,ten-two); 9 printf("Doing it wrong: "); 10 printf("%d minus %d is %d\n",ten); 11 12 getchar(); 13 }
可以使用printf()函数打印int类型的值。%d指明了在一行中打印整数的位置。%d成为转换说明,他指定了printf()应使用什么格式来显示一个值。格式化字符串中的每个%d都与待打印变量列表中相应的int值匹配。
1.2.2 显示八进制和十六进制
在C程序中,既可以使用也可以显示不同进制的数。不同的进制要使用不同的转换说明。以十进制显示数字,使用%d;以八进制显示数字,使用%o;以十六进制显示数字,使用%x。另外,要显示各进制数的前缀0、0x和0X,必须分别使用%#o、%#x,%#X。
1 #include <stdio.h> 2 void main(void){ 3 4 int x = 100; 5 6 printf("dec = %d;octal = %o;hex = %x\n",x,x,x); 7 printf("dec = %d;octal = %#o;hex = %#x\n",x,x,x); 8 9 10 getchar(); 11 }
输出结果:
dec = 100;octal = 144;hex = 64 dec = 100;octal = 0144;hex = 0x64
1.2.3 其他整数类型
C语言提供3个附属关键字修饰基本整数类型:short,long,和unsigned。应记住以下几点:
- short int类型(简写short)占用的空间可能比int类型少,常用与较小数值的场合以节省空间。
- long int或long占用的存储空间可能比int多,适用于较大数值的场合。
- long long int或long long(C99标准加入)占用的储存空间可能比long多,适用于更大数值的场合。该类型至少占64位。
- unsigned int 或unsigned只用于非负值得场合。用于表示正负号的位现在用于表示另一个二进制位,所以无符号整型可以表示更大的数。
- 在C90标准中,添加了unsigned long int或unsigned long和unsigned short int或unsigned short类型。C99标准又添加了unsigned long long int 或unsigned long long
使用多种整数类型的原因:
为什么说short类型“可能”比int类型占用的空间少,long类型“可能”比int类型占用的空间多?因为C语言只规定了short占用的空间不多于int,long占用的存储空间不能少于int。这样规定是为了适应不同的机器。
现在,个人计算机上最常见的设置是,long long占64位,long占32位,short占16位,int占16位或32位(依计算机的自然字长而定)。原则上,这4种类型代表4种不同的大小,但是在实际使用中,有些类型之间通常有重叠。
1.2.4 long常量和long long常量
通常,程序代码中使用的数字都储存为int类型。如果超出int类型能表示的范围,编译器会将其视为long int类型。如果数字超出long可表示的最大值,编译器则将其视为unsigned long类型,如果还不够大,则将其视为long long或unsigned long long类型。
有些情况下,需要编译器以long类型储存一个小数字。例如一些C标准函数要求使用long类型的值。要把一个较小的常量作为long类型对待,可以在值得末尾加上l(小写的L)或L后缀。建议使用L。因此,在int为16位,long为32位的系统中,会把7作为16位储存,把7L作为32位储存。
类似的,在支持long long类型的系统中,也可以使用LL后缀来表示long long类型的值,如3LL。另外,u或U后缀表示unsigned long long,如5ull,10ULL等。
1.2.5 打印short、long、long long和unsigned类型
打印unsigned int类型的值,使用%u转换说明;打印long类型的值,使用%ld转换说明。在x和o前面可以使用l前缀,%lx表示以十六进制格式打印long类型整数,%lo表示以八进制格式打印long类型。注意,虽然C允许使用大写或小写的常量后缀,但是在转换说明中只能是小写、
C语言有多种printf()格式。对于short类型,可以使用h前缀。%hd表示以十进制显示short类型的整数,%hd表示以八进制显示short类型的整数。h和前缀都可以和u一起使用,用于表示无符号类型。例如,%lu表示打印unsigned long类型的值。
1.3 使用字符:char类型
char类型用于储存字符(如,字母或标点符号),但是从技术层面看,char是整数类型。因为char类型实际上储存的是整数而不是字符。计算机使用数字编码来处理字符,即用特定的整数表示特定的字符。
C语言把1字节定义为char类型占用的位(bit)数,因此无论是16位还是32位系统,都可以使用char类型。
1.3.1 打印字符
printf()函数用%c指明待打印的字符。
1.4 _Bool类型
C99标准添加了_Bool类型,用于表示布尔值,即逻辑值true和false。因为C语言用值1表示true,值0表示false,所以_Bool类型实际上也是一种整数类型。但是原则上它仅占用1位存储空间。
1.5 可移植类型:stdint.h和inttypes.h
C语言提供了许多有用的整数类型。但是,某些类型名在不同系统中的功能不一样。C99新增了两个头文件stdint.h和inttypes.h,以确保C语言的类型在各系统中的功能相同。(了解即可)
1.6 float,double和long double
默认情况下,编译器假定浮点型常量是double类型的精度。
在浮点数后面加上f或F后缀可覆盖默认设置,编译器会将浮点型常量看作float类型。使用l或L后缀使得数字成为long double类型。
C99标准添加了一种新的浮点型常量格式——用十六进制表示浮点型常量,即在十六进制数前加上十六进制前缀(0x或0X),用p和P分别代替e和E,用2的幂代替10的幂。(即,p计数法)
例如:0xa.1fp+10 【十六进制a等于十进制10,.1f是1/16加上15/256,p+10是2^10或1024。0xa.1fp+10表示的值是(10+1/16+15/256)* 1024(即十进制10364.0)】
注意,并非所有的编译器都支持C99的这一特性
1.6.2打印浮点值
printf()函数使用%f转换说明打印十进制计数法的float和double类型浮点数,用%e打印指数计数法的浮点数。如果系统支持十六进制格式的浮点数,可用a和A分别代替e和E。使用long double类型要使用%Lf、%Le、%La转换说明。
1 #include <stdio.h> 2 void main(void){ 3 float aboat = 32000.0; 4 double abet = 2.14e9; 5 long double dip = 5.32e-5; 6 7 printf("%f can be written %e\n",aboat,aboat); 8 printf("And it's %a in hexadecimal powers of 2 notation\n",aboat); 9 printf("%f can be written %e\n",abet,abet); 10 printf("%Lf can be written %Le\n",dip,dip); 11 12 getchar(); 13 14 }
1.6.3 浮点值的上溢和下溢(暂略)
1.7 复数和虚数(跳过)
1.8 类型大小
如何知道当前系统的指定类型的大小是多少?
#include <stdio.h> void main(void){ printf("Type int has a size of %d bytes.\n",sizeof(int)); printf("Type char has a size of %d bytes.\n",sizeof(char)); printf("Type long has a size of %d bytes.\n",sizeof(long)); printf("Type short has a size of %d bytes.\n",sizeof(short)); printf("Type float has a size of %d bytes.\n",sizeof(float)); printf("Type double has a size of %d bytes.\n",sizeof(double)); printf("Type long double has a size of %d bytes.\n",sizeof(long double)); getchar(); }