声明:本文是学习《C++ Primer》(王刚 杨巨峰译)过程中记录下的摘抄笔记。感谢两位译者翻译之功!
C++定义了两种基本数据类型:算术类型和空(void)类型。算术类型包括字符、布尔值、整型数、浮点数;空类型不对应具体的值,应用于特殊场合,如函数不返回任何值时使用空类型作为返回类型。
算术类型
算术类型分为两类:整型(包括字符和布尔类型在内)和浮点型。
image.png带符号类型和无符号类型
除去布尔型和扩展的字符型外,其他整型可划分为带符号类型(signed)和无符号类型(unsigned)两种。带符号类型可以表示为正数、0和负数;无符号类型仅能表示大于0的值。
short、int、long、long long都是带符号类型的,通过在类型名前添加unsigned就可得到无符号类型。如 unsigned int、unsigned long、unsigned long long,其中unsigned int可以缩写为unsigned。
与其他整型不同,字符型被分为了三种:char、signed char和unsigned char,类型char和signed char并不相同。尽管字符型有三种,但是字符的表现形式却只有两种:带符号和无符号的。类型char回表示为上述两种形式的一种,具体是哪种取决于编译器。
- 明确知晓数值不为负时,使用无符号类型;
- 使用int执行整数运算。实际应用中,short太小而long和int一般大,如果数值超过int,建议使用long long。
- 算术表达式中不要使用char或bool,只有在存放字符或布尔值时才使用。因为类型char在有些机器上是有符号,在有些机器是无符号的,所以用char运算可能回导致错误。如果需要使用一个不大的整数,明确指定它的类型是signed char或unsigned char。
- 执行浮点运算使用选用double,因为float通常精度不够而和double计算代价相当。甚至对于一些机器,double运算要比float要快。long double提供的精度一般情况下是不必要的,而且运行时的消耗也不可忽视。
类型转换
对象类型定义了对象所能包含的数据和参与的运算,其中一种运算被大多数类型支持,就是将对象从一种给定的类型转换为另一种相关类型。
类型所能表示的值的范围决定了转换的过程:
- 把非布尔型的算术值赋给布尔类型时,初始值为0则结果为false,否则为true
- 把布尔值赋给非布尔型时,初始值为false则结果为0,初始值为true则结果为1
- 把浮点数赋给整数类型时,进行了近似处理,结果值仅保留小数点之前的部分
- 把整数值赋给浮点类型时,小数部分记为0。如果整数所占空间超过浮点类型的容量,精度可能会有损失
- 赋给无符号类型一个超出表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数。如8bit大小的unsigned char可以表示0至255区间内的值,如果赋了一个区间外的值,则实际结果为该值对256取模后的余数。因此把-1赋给8bit的unsigned char所得结果为255
- 赋给带符号类型一个超出表示范围的值时,结果时未定义的。此时,程序可能继续工作、可能崩溃、也可能产生垃圾数据
注:切勿混用带符号类型和无符号类型,如果表达式里既有带符号类型也有无符号类型,当带符号类型取值为负时会出现异常结果,这是因为带符号数回自动转换为无符号数。如在形如a*b的例子中,如果a=-1,b=1,而且a和b都是int,则表达式的值显然为-1。然而,如果a是int,而b是unsigned,则结果须由在当前机器上int所占位数而定。
字面值常量
形如42的值被称作字面值常量,每个字面值常量都对应一种数据类型,字面值常量的形式和值决定了它的数据类型。
整型和浮点型字面值
整型字面值可写作十进制数、八进制数和十六进制数的形式。以0开头的表示八进制数,以0x或0X开头的表示十六进制数。例如,能用下面任意一种形式表示数值20:
20 /* 十进制 */
024 /* 八进制 */
014 /* 十六进制 */
整型字面值具体的数据类型由它的值和符号决定。默认情况下,十进制字面值的带符号数,八进制和十六进制字面值可能是带符号也可能是无符号的。十进制字面值的类型是int、long和long long中容量最小的那个,当然前提是这种类型要能容纳下当前的值。八进制和十六进制字面值的类型是能容纳其数值int、unsigned int、long、unsigned long、long long、unsigned long long中容量最小者。如果一个字面值连与之关联的最大的数据类型都放不下,将产生错误。类型short没有对应的字面值。
浮点型字面值表现为一个小数或以科学计数法表示的指数,其中指数部分用E或e标识:
3.14159
3.14159E0
0.
0e0
.001
字符和字符串字面值
由单引号括起来的一个字符成为char型字面值,双引号括起来的零个或多个字符则构成字符串型字面值。
'a' // 字符字面值
"Hello World!" //字符串字面值
字符串字面值的类型实际是由常量字符构成的数组(array)。编译器在每个字符串的结尾处添加一个空字符('\0'),因此,字符串字面值长度要比内容长度多1。比如'A'表示的就是单独的字符A,而字符串"A"则代表了一个字符的数组,该数组包含两个字符:一个是字母A、另一个是空字符。
转义序列
由两类字符程序员不能直接使用:一类是不可打印的字符,如退格或其他控制字符,因为它们没有可视的图符;另一类是具有特殊含义的字符,如单引号、双引号、问号、反斜线。这种情况下,需要使用转义序列,转义序列均以反斜线开始,C++语言规定的转义序列包括:
image.png
也可以使用泛化的转义序列,形式为\x后紧跟1个或多个十六进制数字,或者\后紧跟1个、2个或3个八进制数字,其中数字部分表示的是字符对应的数值。以下是示例:
image.png
std:cout << "Hi \x4dO\115!\n"; // 输出Hi MOM!,转到新一行
如果反斜线\后面跟着的八进制数字超过3个,只有前三个数字与\构成转义序列。例如,\1234表示2个字符,即八进制数字123对应的字符以及字符4。相反,\x要用到后面跟着的所有数字,例如,"\x1234"表示一个十六位的字符,该字符由这4个十六进制数对应的bit唯一决定。
指定字面值的类型
通过添加下表所列的前缀和后缀,可以改变整型、浮点型和字符型字面值的默认类型。
image.png
布尔字面值和指针字面值
布尔字面值为false和true。指针字面值后续介绍。
网友评论