![C++入门很轻松(微课超值版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/983/44509983/b_44509983.jpg)
2.3 C++数据类型
![](https://epubservercos.yuewen.com/0133F4/23721642901033906/epubprivate/OEBPS/Images/Figure-P31_1851.jpg?sign=1739195805-ZHdgTmlemjSDrWgfaFkfiTdI9r5AQLg7-0-e8f00069994196f5d1318dcac087a8eb)
微视频
掌握并合理定义数据类型是学好一门编程语言的基础。因此,在学习用C++语言编写程序前,首先要学习的就是C++语言中的数据类型。不同的数据类型占用不同的内存空间,合理定义数据类型可以优化程序的运行。
C++为程序员提供了种类丰富的内置数据类型和用户自定义的数据类型。表2-2为7种C++内置数据类型。
表2-2 C++内置数据类型
![](https://epubservercos.yuewen.com/0133F4/23721642901033906/epubprivate/OEBPS/Images/Figure-T31_1855.jpg?sign=1739195805-UcyCfsqDGEEErDL68N7CDzj8gxMnMQ2e-0-7fb5ed09191537a1bd183c705cd4d4f5)
☆大牛提醒☆
宽字符型的定义格式为“typedef short int wchar_t;”,因此wchar_t实际上的空间和short int一样。
2.3.1 整型数据类型
C++语言中的整型数据类型按符号划分,可以分为有符号(signed)和无符号(unsigned)两类;按长度划分,可以分为普通整型(int)、短整型(short)和长整型(long)三类,如表2-3所示。
表2-3 整数类型
![](https://epubservercos.yuewen.com/0133F4/23721642901033906/epubprivate/OEBPS/Images/Figure-T32_2133.jpg?sign=1739195805-hN7iIFYy4uUCmTGQn0AnM1qz1VVowlX6-0-c0e6e5e2e9082377085e7750db9413b5)
为了得到某个类型或某个变量的存储大小,用户可以使用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所示。
![](https://epubservercos.yuewen.com/0133F4/23721642901033906/epubprivate/OEBPS/Images/Figure-P32_2119.jpg?sign=1739195805-X0HiWXv293NKjCnpFAF4DJftde99OcHl-0-c9046e289b545f1d1ac4cd35f6de1b4f)
图2-6 例2.2的程序运行结果
2.3.2 浮点型数据类型
浮点数的小数点位置是不固定的,可以浮动。C++语言中提供了3种不同的浮点型数据类型,包括单精度型、双精度型和长双精度型,如表2-4所示。
表2-4 浮点型数据类型
![](https://epubservercos.yuewen.com/0133F4/23721642901033906/epubprivate/OEBPS/Images/Figure-T33_2435.jpg?sign=1739195805-ZkUkirtuHPnepG8jVjwFpQej7sxTvkE9-0-fd0adca763da473c4c662e551745a53b)
当精度要求不严格时,例如员工的工资需要保留两位小数,就可以使用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所示。
![](https://epubservercos.yuewen.com/0133F4/23721642901033906/epubprivate/OEBPS/Images/Figure-P33_2314.jpg?sign=1739195805-8vnkIrbvs67hlVMHKW7b60Eu2XnrdoDX-0-a23e3e7254d2e3a0ad742668c39b85d5)
图2-7 例2.3的程序运行结果
2.3.3 字符型数据类型
在C++语言中,字符型数据类型使用“' '”来表示,如'A'、'5'、'm'、'$'、';'等,其存储方式是按照ASCII编码方式,且每个字符占一个字节,如表2-5所示。
表2-5 字符型数据类型
![](https://epubservercos.yuewen.com/0133F4/23721642901033906/epubprivate/OEBPS/Images/Figure-T33_2439.jpg?sign=1739195805-z2zwFflZ07zfB6WUcaNWDBk53b58HJeN-0-6b978d2c8f2b90f117ef404e871bb6c4)
【实例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所示。
![](https://epubservercos.yuewen.com/0133F4/23721642901033906/epubprivate/OEBPS/Images/Figure-P34_2587.jpg?sign=1739195805-vT0oeRCCecSBlwpQZTDWQSrmUmoLp888-0-c5a3c8aff55f68cfbd8ca6c75c40cdf3)
图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',然后将该变量输出。
![](https://epubservercos.yuewen.com/0133F4/23721642901033906/epubprivate/OEBPS/Images/Figure-P34_2601.jpg?sign=1739195805-mgBomvpUPqSOyuRfeMWEsvUp8MZVaRxI-0-4512b53fb6a956a6e0333fe6edd7d61a)
图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所示。
![](https://epubservercos.yuewen.com/0133F4/23721642901033906/epubprivate/OEBPS/Images/Figure-P35_2718.jpg?sign=1739195805-fZHBoCGrCXhm6mpiS61VsGRpFzyzZbjN-0-2160d2f2850866129abdbe748870e426)
图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输出。
![](https://epubservercos.yuewen.com/0133F4/23721642901033906/epubprivate/OEBPS/Images/Figure-P35_2734.jpg?sign=1739195805-IWlgInaH6LI0cCt9v2OWzELKoPUS4iRa-0-ca3d93210c1143c10a0d2ec51f196b6a)
图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的存储字节大小输出。
![](https://epubservercos.yuewen.com/0133F4/23721642901033906/epubprivate/OEBPS/Images/Figure-P36_2838.jpg?sign=1739195805-hl08ojtUs9vBD1zQyruZNnCFkpQLP3Cd-0-d03a8471dcd4b67e975f4a51217da937)
图2-12 例2.7的程序运行结果
从运行结果来看,a和b属于同一种数据类型(unsigned int型),因为UINT标识符已经定义为unsigned int类型。