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" 的数据类型和存储形式不一样。