C++入门很轻松(微课超值版)
上QQ阅读APP看书,第一时间看更新

2.3 C++数据类型

微视频

掌握并合理定义数据类型是学好一门编程语言的基础。因此,在学习用C++语言编写程序前,首先要学习的就是C++语言中的数据类型。不同的数据类型占用不同的内存空间,合理定义数据类型可以优化程序的运行。

C++为程序员提供了种类丰富的内置数据类型和用户自定义的数据类型。表2-2为7种C++内置数据类型。

表2-2 C++内置数据类型

☆大牛提醒☆

宽字符型的定义格式为“typedef short int wchar_t;”,因此wchar_t实际上的空间和short int一样。

2.3.1 整型数据类型

C++语言中的整型数据类型按符号划分,可以分为有符号(signed)和无符号(unsigned)两类;按长度划分,可以分为普通整型(int)、短整型(short)和长整型(long)三类,如表2-3所示。

表2-3 整数类型

为了得到某个类型或某个变量的存储大小,用户可以使用sizeof(type)表达式查看对象或类型的存储字节大小。

【实例2.2】编写程序,获取整型数据类型的存储大小、字节数等信息,并在屏幕上输出(源代码\ch02\2.2.txt)。

    #include <iostream>             //头文件引用
    using namespace std;            //命名空间
    int main()                      //主函数
    {
        cout << "short: \t\t" << "所占字节数:" << sizeof(short);
        cout << "\t最大值:" << (numeric_limits<short>::max)();
        cout << "\t最小值:" << (numeric_limits<short>::min)() << endl;
        cout << "int: \t\t" << "所占字节数:" << sizeof(int);
        cout << "\t最大值:" << (numeric_limits<int>::max)();
        cout << "\t最小值:" << (numeric_limits<int>::min)() << endl;
        cout << "unsigned: \t" << "所占字节数:" << sizeof(unsigned);
        cout << "\t最大值:" << (numeric_limits<unsigned>::max)();
        cout << "\t最小值:" << (numeric_limits<unsigned>::min)() << endl;
        cout << "long: \t\t" << "所占字节数:" << sizeof(long);
        cout << "\t最大值:" << (numeric_limits<long>::max)();
        cout << "\t最小值:" << (numeric_limits<long>::min)() << endl;
        cout << "unsigned long: \t" << "所占字节数:" << sizeof(unsigned long);
        cout << "\t最大值:" << (numeric_limits<unsigned long>::max)();
        cout << "\t最小值:" << (numeric_limits<unsigned long>::min)() << endl;
    }

程序运行结果如图2-6所示。

图2-6 例2.2的程序运行结果

2.3.2 浮点型数据类型

浮点数的小数点位置是不固定的,可以浮动。C++语言中提供了3种不同的浮点型数据类型,包括单精度型、双精度型和长双精度型,如表2-4所示。

表2-4 浮点型数据类型

当精度要求不严格时,例如员工的工资需要保留两位小数,就可以使用float类型;double类型提供了更高的精度,对于绝大多数用户来说已经够用;long double类型支持极高精度,但很少被使用。

【实例2.3】编写程序,输出浮点类型占用的存储空间及其范围值(源代码\ch02\2.3.txt)。

    #include <iostream>             //头文件引用
    using namespace std;            //命名空间
    int main()                      //主函数
    {
         cout << "float: \t\t" << "所占字节数:" << sizeof(float);
         cout << "\t最大值:" << (numeric_limits<float>::max)();
         cout << "\t最小值:" << (numeric_limits<float>::min)() << endl;
         cout << "double: \t" << "所占字节数:" << sizeof(double);
         cout << "\t最大值:" << (numeric_limits<double>::max)();
         cout << "\t最小值:" << (numeric_limits<double>::min)() << endl;
         cout << "long double: \t" << "所占字节数:" << sizeof(long double);
         cout << "\t最大值:" << (numeric_limits<long double>::max)();
         cout << "\t最小值:" << (numeric_limits<long double>::min)() << endl;
    }

程序运行结果如图2-7所示。

图2-7 例2.3的程序运行结果

2.3.3 字符型数据类型

在C++语言中,字符型数据类型使用“' '”来表示,如'A'、'5'、'm'、'$'、';'等,其存储方式是按照ASCII编码方式,且每个字符占一个字节,如表2-5所示。

表2-5 字符型数据类型

【实例2.4】编写程序,输出字符型数据类型所占字节数(源代码\ch02\2.4.txt)。

    #include <iostream>             //头文件引用
    using namespace std;            //命名空间
    int main()                      //主函数
    {
        cout << "char: \t\t" << "所占字节数:" << sizeof(char)<< endl;
        cout << "signed char: \t" << "所占字节数:" << sizeof(signed char)<< endl;
        cout << "unsigned char: \t" << "所占字节数:" << sizeof(unsigned char)<< endl;
    }

程序运行结果如图2-8所示。

图2-8 例2.4的程序运行结果

字符型数据既可以使用字符形式输出(即采用%c格式控制符),也可以使用整数形式输出。例如:

    char c ='A';
    printf("%c,%u ",c,c);

以上这段代码的输出结果是:A,65。此处的65是字符'A'的ASCII码。

【实例2.5】编写程序,实现字符和整数的相互转换输出(源代码\ch02\2.5.txt)。

    #include <iostream>
    using namespace std;
    int main()
    {
       char cch='A';             //定义字符变量并赋值
       int ich='A';              //定义整型变量并赋值
       cout<<"cch="<<cch<<endl;  //输出单个字符
       cout<<"ich="<<ich<<endl;  //输出字符对应的ASCII码
    }

程序运行结果如图2-9所示。在本实例中先定义了一个char型变量cch,其后给cch赋值为'A',将字符变量cch输出,再定义一个int型变量ich,给它赋值也是'A',然后将该变量输出。

图2-9 例2.5的程序运行结果

从结果来看,定义了字符型数据cch和整型数据ich,给它们赋值都为字符'A',输出结果却不同,整型变量ich的输出为65。这是因为字符型数据在计算机内部是转换为整型数据来操作的,如上述代码中的字母A,系统会自动将其转换为对应的ASCII码值65。

知识扩展:C++语言中还保留着屏幕输出函数printf(),使用该函数可以将任意数值类型的数据输出到屏幕中。因此将上述实例的代码修改为如下代码,也同样可以实现字符和整数的相互转换输出。代码如下:

    #include <iostream>          //头文件引用
    using namespace std;         //命名空间
    int main()                   //主函数
    {
        char cch='A';            /*字符变量cch初始化*/
        int ich='A';             /*整型变量ich初始化*/
        printf("cch=%c\n",cch);  /*以字符型输出cch*/
        printf("ich=%u\n",ich);  /*输出字符对应的ASCII码*/
    }

程序运行结果如图2-10所示。

图2-10 字符和整数的相互转换输出

2.3.4 布尔型数据类型

在逻辑判断中,结果通常只有真和假两个值。C++语言中提供了布尔类型(bool)来描述真和假。布尔类型共有两个取值,分别为true和false,true表示真,false表示假。

在程序中,布尔类型被作为整数类型对待,true表示1,false表示0。将布尔类型赋值给整型是合法的;反之,将整型赋值给布尔类型也是合法的。例如:

【实例2.6】编写程序,定义布尔型数据类型,并输出布尔型数值(源代码\ch02\2.6.txt)。

    #include <iostream>
    using namespace std;
    int main()
    {
         bool bflag=true;                     //定义布尔型变量并赋值
         int iflag=true;                      //定义整型变量并赋值
         cout<<"bflag="<<bflag<<endl;         //输出布尔型变量的值
         cout<<"iflag="<<iflag<<endl;         //输出整型变量的值
    }

程序运行结果如图2-11所示。在本实例中先定义了一个bool类型的变量bflag并赋值为true,又定义了一个int型的变量iflag并赋值为true,最后将iflag和bflag输出。

图2-11 例2.6的程序运行结果

☆大牛提醒☆

从运行结果可以看到,布尔型变量bflag和整型变量iflag的输出值并不是true,而都是整数值1,这是使用布尔类型数据时需要注意的。

2.3.5 自定义数据类型

使用typedef可以自定义数据类型,语句由3个部分组成,分别是关键字typedef、类型名称、类型标识符。具体的语法格式如下:

    typedef 类型名称 类型标识符;

以上格式中typedef为系统关键字;“类型名称”为已知数据类型名称,包括基本数据类型和用户自定义数据类型;“类型标识符”为新的类型名称。例如:

    typedef double LENGTH;
    typedef unsigned int COUNT;

定义新的类型名称后,可以像基本数据类型那样定义变量。例如:

    typedef unsigned int COUNT;
    unsigned int b;
    COUNT c;

typedef的主要应用有如下几种形式。

(1)为基本数据类型定义新的类型名。

(2)为自定义数据类型(结构体、公用体和枚举类型)定义简洁的类型名称。

(3)为数组定义简洁的类型名称。

(4)为指针定义简洁的名称。

【实例2.7】编程程序,自定义数据类型,然后输出自定义数据类型所占字节数(源代码\ ch02\2.7.txt)。

    #include <iostream>
    using namespace std;
    typedef unsigned int UINT;
    int main()
    {
         unsigned int a;
         a=123;
         UINT b;
         b=456;
         cout<<"a="<<a<<endl;
         cout<<"sizeof a="<<sizeof(a)<<endl;
         cout<<"b="<<b<<endl;
         cout<<"sizeof b="<<sizeof(b)<<endl;
    }

程序运行结果如图2-12所示。在本实例中,使用type def定义了一个UINT类型,该类型等同于int型。在主程序中,定义了一个int型变量a并赋值为125;定义了一个UNIT型变量b并赋值为456。将a的值和a的存储字节大小输出,将b的值和b的存储字节大小输出。

图2-12 例2.7的程序运行结果

从运行结果来看,a和b属于同一种数据类型(unsigned int型),因为UINT标识符已经定义为unsigned int类型。