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 复数和虚数(跳过)

猜你喜欢

转载自www.cnblogs.com/mylearning-log/p/10932198.html