1.3 C++语言的基本数据类型与存储形式
分类是我们日常生活中经常碰到的事情。分类指的是把具有相同特征(称为属性)的对象集合抽象为一种“类型”,并且具有一个特定的类型名作为标识。例如,人、学生、树、书、房子等都是类型,而不特指某一具体对象。任何东西都可以归属于某种类型,各个对象以不同的特征值相区别。例如,书的主要属性有:书名、作者、出版社、出版日期。如果特指某本书,这些属性就必然具有特定的数据值。
在程序设计中,数据“类型”是对数据的抽象。类型相同的数据有相同的表示形式、存储格式以及相关的操作。
例如,“整型”数据是计算机表示整数的子集,整数类型的名字是int,以4字节(32二进制位)存储,表示数值范围为-2147 483648~2147 483647。整数可以参与+,-,*,/ 等算术运算。
程序中使用的所有数据都必定属于某一种数据类型。
1.3.1 C++语言的数据类型
C++语言的数据类型表示如图1.1所示。
图1.1 C++语言的数据类型
基本类型是系统用于表示可以直接处理的数据值。结构类型是由一些其他类型按一定规则组合而成的。
指针是一种特殊的简单数据类型,用于表示对象的地址值。
空类型不是值意义可以直接解释的数据类型,它用于表示函数无返回值,或指针所指对象无结构。此时需要通过强类型转换才能解释数据。
1.3.2 数据存储
所有信息在计算机中的存储都采用由0和1组成的代码。内存以字节为基本存储单位,1字节是8位二进制位。例如:
0000000010101011
表示2字节的二进制数。
不同类型数据占用不同长度的存储空间。例如,字符型(char)数据占1字节,整型(int)占4字节。
不同类型数据的存储长度和格式的不同,决定了数据的示数范围和精度不相同。例如:
2字节表示的短整型数(short int),示数范围为-32768~32767;
4字节表示的整型数(int),示数范围为-2147 483648~2147 483647;
4字节表示的单精度浮点型(float),示数范围为-3.4×1038~3.4×1038,示数精度约为6 位有效数字;
8字节表示的双精度浮点型(double),示数范围为-1.7×10308~1.7×10308,示数精度约为12位有效数字。
另外,在内存中,同一个二进制位串可以用不同的类型解释,因而会表示不同的值。例如,二进制位串:
0000000001000001
解释为int类型时,值为整数65;解释为char类型时,表示两个字符:一个空字符和一个字符A。
定义一个变量时,计算机根据变量的类型分配存储空间,并以该类型解释存放的数据。
1.3.3 基本数据类型
基本数据类型是语言系统预定义的,用户可以直接引用。本章首先介绍C++语言的基本数据类型,其他数据类型将在后续章节中逐步介绍。
表1.1以32位字长机器为例,给出C++语言基本数据类型描述。如果机器字长16位,则示数范围和精度会有所不同。表中方括号括起来的内容表示在说明语句中可以省略。
表1.1 C++语言基本数据类型
注:short,signed,unsigned,long称为修饰符。short只能修饰int,long只能修饰int和double,signed和unsigned只能修饰char和int。
1.整型
(1)int
C++的int数据类型按示数范围不同分为:短整数(short int)、有符号短整数(signed short int)、无符号短整数(unsigned short int)、有符号整数(signed int)、无符号整数(unsigned int)、长整数(long int)、有符号长整数(signed long int)、无符号长整数(unsigned long int)等。
除了用十进制数形式表示数据外,C++还可以用八进制数和十六进制数形式表示正整数。
十进制整数是带或者不带正负号,没有小数点,由数字0~9组成的符号串。C++的十进制整数不能以0开始。例如,305、-1094、+7256都是合法的十进制整数。
后缀L(或l)表示长整数,后缀U(或u)表示无符号整数。例如:
95476L //一个长整数 37821U //一个无符号整数 9573256UL //一个无符号长整数
八进制数是以0 为前缀,没有小数点,由数字0~7 组成的符号串。八进制数只能表示正整数。例如:
八进制数 023 //等于十进制数19 八进制数 0174 //等于十进制数124
十六进制数是以0x(或0X)为前缀,没有小数点,由0~9及a~f(或A~F)组成的符号串。十六进制数只能表示正整数。例如:
十六进制数 0x3b //等于十进制数59 十六进制数 0XFF //等于十进制数255
(2)bool
C++的逻辑类型用关键字bool定义。逻辑类型只有两个值true和false。
逻辑数据用于表示判断的结果是否成立,所以只有两个可能值。例如,“1 大于3”,这种情况不成立,判断结果为false。“2+3等于3+2”这种情况成立,判断结果为true。
在C++语言中,逻辑值true和false实际上是用整型值1和0参与运算。
【例1-4】输出逻辑数据值。
#include <iostream> using namespace std; int main() { bool b; b=false; cout<<"false: "<<b<<endl; b=true; cout<<"true: "<<b<<endl; }
程序运行结果:
false: 0 true: 1
(3)enum
枚举类型是一种用户自定义的数据类型,用关键字enum定义,是用标识符表的序号表示的数据。
【例1-5】输出枚举类型数据值。
#include <iostream> using namespace std; enum colour{ red, yellow, blue, white, black }; int main() { colour c; c=red; cout<<"red: "<<c<<endl; c=blue; cout<<"blue: "<<c<<endl; c=black; cout<<"black: "<<c<<endl; }
程序运行结果:
red: 0 blue: 2 black: 4
2.浮点型
浮点型又称实型,即我们通常所说的实数。浮点数由整数部分和小数部分组成。
浮点数有两种示数形式:小数示数法和指数示数法。
小数示数法又称常用示数法,由数字和小数点组成。例如:
13.89 .638 -452. //都是正确的小数
指数示数法又称科学示数法,由尾数、指数符和指数组成:
尾数 E|e 指数
其中,“尾数”可以是整数或小数,“指数”必须是整数。指数符可以为E或e,表示以10为底的指数。对于一个用指数示数法表示的浮点数,尾数和指数都不能省略。例如:
12E8 //等于 12×108 314159E-5 //等于 314159×10-5 .618e3 //等于 0.618×103 e-7 .E10 1e2.5 //都是非法示数形式
C++语言的浮点数有3种:单精度浮点型(float)、双精度浮点型(double)和长双精度浮点型(long double)。不加后缀的浮点数默认为double型,float型数据后缀为F或f,long double型数据后缀为L或l。例如:
1.572f 8.94F .025e2f //都是单精度浮点数 60.34 7.13e-3 1e-6 //都是双精度浮点数 3.14L .55E12L 23.0L //都是长双精度浮点数
3.字符型
字符型的类型标识符是char。字符型数据为一对单引号相括的一个字符。例如:
'A' '4' ',' ' ' //都是字符常量。空格也是一个字符
注意,'A' 表示字符,A表示标识符,'4' 表示字符,4表示整数值。
除了直接用字符表示字符型数据外,还可以在ASCII码的八进制数值、十六进制数值之前添加转义符反斜杠“\”,表示把它们的值转换成字符。
\ddd \xhh
其中,ddd是1~3位八进制数,hh是1~2位十六进制数。此时,八进制数值和十六进制数值略去前缀0,因为嵌入字符串时,'\0'表示空字符。这种情况特别适用于表示一些不可见的控制符。例如:
'\101' '\x41' //都可以表示'A' '\12' '\x0A' '\n' //都可以表示换行 '\0' //空字符
注意空字符与空格字符的区别。空字符的ASCII值为0,空格字符的ASCII值为32。
对一些常用的控制符,C++语言用简洁的转义符代替。例如,换行符表示为'\n',制表符表示为'\t'等。
在程序中为了表示已经用做语义符如“\”、“'”、“"”等的字符值,要在这些字符前添加 “\”转义:
'\\' '\'' '\"'
例如,执行语句:
cout<<"C++注释行格式为:\" \\\\字符串\" "<<endl;
屏幕的显示结果为:
C++注释行格式为:"\\字符串 "
表1.2列出C++常用的转义字符。
表1.2 C++语言常用转义字符
C++没有把字符串作为基本类型。字符串常量是用双引号相括的字符序列,以数组形式存放。例如,以下都是字符串常量:
"Name" "2002" "x"
系统在内存存放字符串时,除了每个符号占一个字节外,还自动添加一个空字符'\0'作为串结束标志。所以,字符'x' 和字符串 "x" 的数据类型和存储形式不一样。