
2.3 数据类型
使用C++语言可以处理大量种类繁多的数据。为了方便处理,C++语言的标准会将数据分为不同类型,也就是数据类型。每种数据类型所占的内存空间会有所不同。
2.3.1 什么是进制
进制也就是进位计数制,是人为定义的带进位的计数方法。生活中能接触到的进制一般有两种,一种是十进制,也就是“逢十进一”,在计数时会经常使用;另一种是五进制,也就是“逢五进一”,在班级投票选举中常用,也就是写“正”字,每满五票可以写一个“正”字,方便统计票数。
计算机使用的进制为二进制,每位可以使用0与1这两个整数表示,遵循“逢二进一”的规则。二进制也可以称为机器码,一般编程人员不用编写,主要用于底层开发或者机器识别。在计算机中数据会以二进制形式进行存放,如图2.4所示。

图2.4 二进制数据
以下重点对二进制进行讲解。
1.二进制表示
二进制数据是用0和1两个数码来表示的数。它的基数为2,并且每一个数都会使用括号括起来,如图2.5所示。

图2.5 二进制
二进制数1001的表示形式如下。

2.进位规则
进位规则为“逢二进一”,即两数相加时低位满二就向高位进一,进上去的1在高位进行运算时用到,如图2.6所示。此图是两个二进制数进行加法运算。

图2.6 进位规则
3.借位规则
借位规则为“借一当二”,即当两个数相减时,被减数的低位小于减数的低位时,向高位借一,看成2加在被减数上,再去减减数,低位向高位借走的1,在借走的高位做运算时用到,如图2.7所示。此图是两个二进制数进行减法运算。

图2.7 借位规则
2.3.2 C++支持的进制
在C++语言中,开发者可以使用二进制、八进制、十进制与十六进制四种进制在代码中书写整数。接下来将对这四种进制进行详细介绍。
1.二进制
书写二进制的整数时,需要为整数添加一个前缀“0b”或“0B”,如图2.8所示。

图2.8 二进制数书写规范
【示例2-1】下面将一个二进制数以十进制数形式输出。

程序运行结果如下。

0b1001中的0b为二进制标识,告知计算机该数为一个二进制数,然后系统会在屏幕输出十进制数。
二进制数转换为十进制数的方法如图2.9所示。

图2.9 二进制数转换为十进制数
在转换中,将二进制数从低位到高位依次使用2的次幂进行替换,然后与二进制数0或1进行对位相乘,最后将所有乘积相加,得出二进制数对应的十进制数。
2.八进制
八进制数的每一位都可以使用0~7这八个整数,遵循“逢八进一”的规则。书写八进制的整数时,需要为整数添加一个前缀数字“0”,如图2.10所示。八进制常在关卡中使用,比如游戏中关卡一般都是8个大关卡,每个大关卡有8个小关卡。

图2.10 八进制数书写规范
【示例2-2】下面将一个八进制数以十进制数形式输出。

程序运行结果如下。

八进制数转换为十进制数的方法如图2.11所示。

图2.11 八进制数转换为十进制数
在转换中,将八进制数从低位到高位依次使用8的次幂进行替换,然后与八进制数进行对位相乘,最后将所有乘积相加,得出八进制数对应的十进制数。
二进制数转换为八进制数就是将二进制数从右向左每三位合并为一位。下面将一个二进制的111111转换为八进制的077,如图2.12所示。

图2.12 二进制数转换为八进制数(1)
在转换时,有时会发现二进制的位数无法以每三位为单元进行分割,此时就需要使用0来补位。下面将一个二进制的10011011转换为八进制的0233,如图2.13所示。

图2.13 二进制数转换为八进制数(2)
3.十进制
由于人的手指是十个,十进制相对符合人的人体构造,所以十进制是人们最常使用的进制。
十进制数每一位都可以使用0~9共十个整数,遵循“逢十进一”的规则。十进制整数有负值,在书写时不能以数字“0”开始,但是可以以负号开始,如图2.14所示。

图2.14 十进制数书写规范
十进制数转换为二进制数时要用到辗除法,也就是“除模取余”法。除模取余是指将一个几进制的数转换为另一个进制的数时,另一个进制就是模,用将要转换的进制数除以模,取它的余数。下面将一个十进制的19转换为二进制的10011,如图2.15所示。

图2.15 十进制数转换为二进制数
4.十六进制
随着计算机处理的数据不断增加,人们发现使用八进制也无法满足需求,因此程序员创造出了十六进制。例如,颜色的表示模式分为RGB模式与CMYK模式,其中RGB模式就是使用6位十六进制数来表示颜色,如#FF0000。
十六进制数每一位都可以使用0~9和A~F共16个字符表示,遵循“逢十六进一”的规则。十六进制整数在书写时需要在整数前加“0x”或“0X”,如图2.16所示。

图2.16 十六进制数书写规范
【示例2-3】下面将一个十六进制数以十进制数形式输出。

程序运行结果如下。

十六进制数转换为十进制数的方法如图2.17所示。

图2.17 十六进制数转换为十进制数
二进制数转换为十六进制数就是将二进制数从右向左每四位合并为一位。下面将一个二进制的10101100转换为十六进制的0xAC,如图2.18所示。

图2.18 二进制数转换为十六进制数(1)
在转换时,有时会发现二进制数无法以每四位为单元进行分割,此时就需要在前面使用0来补位。例如,下面将一个二进制的11011转换为十六进制的0x1B,如图2.19所示。
二进制、八进制、十进制及十六进制之间的转换如表2.2所示。对于这个表应该做到熟记于心,可以快速读懂各种进制的数字。

图2.19 二进制数转换为十六进制数(2)
表2.2 进制之间的转换

2.3.3 整数类型
计算机硬件的空间是有大小限制的,所以在处理整数数据时需要控制整数所占的空间大小。根据所占空间大小,可以将整数分为四种,即整型、短整型、长整型、长长整型。下面将进行讲解。
1.整型
在C++语言中,整型是整数的默认保存类型。整型使用int表示,占4字节,如图2.20所示。

图2.20 整型
由于存储所使用的空间有限,整型可以表达的整数范围为-231~231-1,即-2147483648~2147483647,如图2.21所示。

图2.21 整型类型的范围
【示例2-4】下面输出整数的字节长度,判断整数值是否会被默认保存为整型。

程序运行结果如下。

sizeof()为一个函数,可以将sizeof()函数简单理解为一个机器,可以告诉你指定值在内存中的长度。在这里判断的是整数10在内存中所占字节长度。
【示例2-5】下面输出整型类型占几字节。

程序运行结果如下。

2.短整型
短整型可以用于表示数值较小的整数,使用英文字母short表示,占2字节,如图2.22所示。

图2.22 短整型
短整型可以表示的范围为-215~215-1,即-32768~32767,如图2.23所示。

图2.23 短整型类型的范围
【示例2-6】下面输出短整型占几字节。

程序运行结果如下。

3.长整型
C++语言还提供长整型用来保存更大的整数。该类型使用英文字母long表示。在Visual Studio 2019中,长整型使用4字节,如图2.24所示。

图2.24 长整型
长整型的范围为-231~231-1,即-2147483648~2147483647,如图2.25所示。

图2.25 长整型类型的范围
【示例2-7】下面输出长整型占几字节。

程序运行结果如下。

在书写的时候长整型要在数字后面加字母l或L,如355L。
【示例2-8】下面输出带L后缀的数字的字节长度。

程序运行结果如下。

4.长长整型
C++语言还提供长长整型用来保存更大的整数。该类型使用两个英文字母long表示,即long long。长长整型使用8字节,如图2.26所示。

图2.26 长长整型
长长整型的范围为-263~263-1,即-9223372036854775808~9223372036854775807,如图2.27所示。

图2.27 长长整型类型的范围
【示例2-9】下面输出长长整型占几字节。

程序运行结果如下。

在书写的时候长长整型要在数字后面加字母ll或LL,如355LL。
【示例2-10】下面输出带LL后缀的数字的字节长度。

程序运行结果如下。

5.无符号整型
无符号整型只能表示0和正数,它会将整型的二进制符号位挪用为整数位。这样无符号整型的正数范围会比有符号整型的正数范围扩大一倍,如图2.28所示。
在整型类型名称前添加前缀unsigned,即构成对应的无符号整型。书写时在数字后面加字母u或U。无符号整型包含以下几种。
❑ 无符号整型:使用英文字母unsigned int表示,占4字节,可表示的范围为0~4294967295。
❑ 无符号短整型:使用英文字母unsigned short表示,占2字节,可表示的范围为0~65535。
❑ 无符号长整型:使用英文字母unsigned long表示,占4字节,可表示的范围为0~4294967295。
❑ 无符号长长整型:使用英文字母unsigned long long表示,占8字节,可表示的范围为0~18446744073709551615。

图2.28 无符号整型4字节
在需要处理的数据只有正整数时,使用无符号整型是十分划算的,这样可以更好地利用计算机的空间提高计算效率。
【示例2-11】unsigned类型的数据是不会显示为负数的,如果出现负数会输出4294967196。下面输出两个unsigned 整型数字,一个为正数,一个为负数。

程序运行结果如图2.29所示。

图2.29 程序运行结果
总结前面讲解的所有整数类型,共有八种,如表2.3所示。
表2.3 八种整型

续表

2.3.4 浮点类型
浮点型数据即实数。浮点类型用于处理实数数据,是计算机使用最广泛的一种类型。浮点数利用指数使小数点的位置可以根据需要而上下浮动,从而可以灵活地表达更大范围的实数。
根据浮点的精度不同,浮点类型分为单精度类型(float)、双精度类型(double)和扩展精度浮点类型(long double)。下面进行详细讲解。
1.单精度类型
单精度类型用于保存较小的实数。该类型使用英文字母float表示。float占4字节,如图2.30所示。单精度的表示范围为3.4E-38~3.4E+38,有效位为6位。

图2.30 float整型
【示例2-12】下面输出单精度的字节长度。

程序运行结果如下。

2.双精度类型
双精度类型用于保存较大的实数。该类型使用英文字母double表示。double占8字节,如图2.31所示。双精度的表示范围为1.7E-308~1.7E+308,有效位为10位。

图2.31 double整型
【示例2-13】下面输出双精度的字节长度。


程序运行结果如下。

3.扩展精度浮点类型
扩展精度浮点类型用于有特殊浮点需求的硬件中,具体的实现方式和精度也不太相同。该类型使用英文字母long double表示。long double占8字节,表示范围为1.7E-308~1.7E+308,有效位为10位。
2.3.5 字符类型和字符串
下面对字符类型进行详细讲解。
1.字符类型
字符类型用于处理字符数据,如人名、字母等。C++语言中,字符类型在内存中占1字节,该类型使用英文字母char表示,其表示数值的范围为127~-128。
字符型数据的本质是存储字符的ASCII(American Standard Code for Information Interchange,美国标准信息交换码)码值。根据ASCII码标准,数值65代表大写字母A,而97则代表小写字母a,ASCII码前128个码的十进制数表示如表2.4所示。
表2.4 ASCII码表

续表

在ASCII码表中的特殊字母组合,其含义如表2.5所示。
表2.5 特殊字符的含义

在C++中还有一些是由斜杠和多个字符所组成的,但被当作单一字符处理的特殊字符,它们被称为转义字符。转义字符是不可以被打印的字符,都具有特殊的功能,如表2.6所示。
表2.6 转义字符

续表

【示例2-14】下面输出一个水平制表符与八进制数172对应的字符z。字符z的ASCII码值十进制数为122,转换为八进制数172。

程序运行结果如图2.32所示。

图2.32 输出指定转义字符
2.有符号与无符号字符类型
字符型数据根据有无符号可以分为有符号字符型和无符号字符型。有符号字符型用英文signed char表示,无符号字符型用英文unsigned char表示,其对应的取值范围如表2.7所示。
表2.7 字符数据类型

3.字符串类型
处理单个字符时可以使用字符类型,处理多个字符时就可以使用字符串类型。例如,abcde、Hello、1234这些都是字符串。C++中字符串类型不属于基础数据类型,在后面的章节中会进行详细讲解。
2.3.6 布尔类型
布尔类型是用于表达逻辑判断的一种数据类型。C++语言中,布尔类型使用英文字母bool表示。该类型只有真(true)和假(false)两个值。使用整数表示时,0表示假,1表示真。布尔类型多用于程序判断、流程控制及逻辑判断。简单理解布尔类型就像做判断题,只有对和错两种结果。