• 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
    ",ten,2,ten-two);
     9     printf("Doing it wrong: ");
    10     printf("%d minus %d is %d
    ",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
    ",x,x,x);
     7     printf("dec = %d;octal = %#o;hex = %#x
    ",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
    ",aboat,aboat);
     8     printf("And it's %a in hexadecimal powers of 2 notation
    ",aboat);
     9     printf("%f can be written %e
    ",abet,abet);
    10     printf("%Lf can be written %Le
    ",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.
    ",sizeof(int));
        printf("Type char has a size of %d bytes.
    ",sizeof(char));
        printf("Type long has a size of %d bytes.
    ",sizeof(long));
        printf("Type short has a size of %d bytes.
    ",sizeof(short));
        printf("Type float has a size of %d bytes.
    ",sizeof(float));
        printf("Type double has a size of %d bytes.
    ",sizeof(double));
        printf("Type long double has a size of %d bytes.
    ",sizeof(long double));
        getchar();
    }
  • 相关阅读:
    课程总结
    2018-2019-2 20189205《移动平台应用开发实践》第一周作业
    2019年3月3日 2018-2019-2 20189205《移动平台应用开发实践》第二周作业
    2018-2019-2 20189205《移动平台应用开发实践》第十二周作业
    2018-2019-2 20189205《移动平台应用开发实践》第十一周作业
    项目代码分析
    2018-2019-2 20189205《移动平台应用开发实践》第十周作业
    博客分工
    2018-2019-2 20189205《移动平台应用开发实践》第九周作业
    2018-2019-2 20189205《移动平台应用开发实践》第八周作业
  • 原文地址:https://www.cnblogs.com/mylearning-log/p/10932198.html
Copyright © 2020-2023  润新知