Skip to content

Latest commit

 

History

History
105 lines (76 loc) · 4.05 KB

File metadata and controls

105 lines (76 loc) · 4.05 KB

2.1 基本内置类型

本章术语:

  • 算数类型(arithmetic type):字符、整型数、布尔值、浮点数
  • 空类型(void)
  • 字面值常量(literal)
  • 转义序列(escape sequence)

2.1.1 算数类型

char16_tchar32_t 类型为 Unicode 字符集服务。

字符类型有三种: charsigned charunsigned char 三种, 但实际的表现形式只有 signed charunsigned char 两种。 char 会具体表现为这两种之一。具体是哪种有编译器决定。

类型的选取准则:

  • 当明确知道数值不可能为负时,选用无符号类型。
  • 使用 int 执行整数运算。如果数值超出了 int 的表示范围,则使用 long long
  • 算数表达式中不要使用 charbool ,它们只用来存放字符或布尔值。
    如果需要使用一个不大的整数,需要明确指出其类型是 signed char 或是 unsigned char
  • 使用 double 执行浮点数运算, float 通常精度不够,并且两者计算代价相近。

2.1.2 类型转换

类型转换过程:

  • 当把一个非布尔类型的算数值赋给布尔类型时,初始值为 0 的结果为 false ,否则结果为 true 。
  • 当把一个布尔值赋给非布尔类型时,初始值为 false 则结果为 0 ,初始值为 true 则结果为 1 。
  • 当把一个浮点数赋给整数类型时,结果仅保留小数点之前的部分。
  • 当把一个整数值赋给浮点类型时,小数部分记为 0 。如果该整数所占的空间超过了浮点类型的容量,精度可能有损失。
  • 当赋给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数。
  • 当赋给带符号类型一个超出它表示范围的值时,结果是未定义的。程序可能继续工作、可能崩溃,也可能产生垃圾数据。

当一个算数表达式中既有无符号数又有 int 值时,那个 int 值就会转换成无符号数。
当从无符号数中减去一个值时,不管这个值是不是无符号数,都必须确保结果非负。
切勿混用带符号类型和无符号类型

2.1.3 字面值常量

整型和浮点型字面值

0 开头的整数代表八进制数,以 0x 或 0X 开头的代表十六进制数。
默认情况下,十进制字面值是带符号数,八进制和十六进制字面值既可能是带符号的也可能是无符号的。
浮点型字面值表现为一个小数或以科学计数法表示的指数,其中指数部分用 E 或 e 标识。

字符和字符串字面值

由单引号括起来的一个字符称为 char 型字面值,双引号括起来的零个或多个字符构成字符串型字面值。
如果两个字符串字面值位置紧邻且仅由空格缩进换行符分隔,则它们实际上是一个整体。如:

std::cout << "a really, really long string literal "
             "that spans two lines" << std::endl;

转义序列

泛化转义序列: \x 后紧跟十六进制数字, \ 后紧跟八进制数字。
如果反斜线后面跟着的八进制数字超过 3 个,则只有前 3 个数字与 \ 构成转义序列。而 \x 要用到后面跟着的所有数字。

指定字面值的类型

字符和字符串字面值

前缀 含义 类型
u Unicode 16 字符 char16_t
U Unicode 32 字符 char32_t
L 宽字符 wchar_t
u8 UTF-8(仅用于字符串字面常量) char

整型字面值

后缀 最小匹配类型
u / U unsigned
l / L long
ll / LL long long

U 可以与 L 或 LL 合在一起使用。

浮点型字面值

后缀 类型
f / F float
l / L long double

布尔字面值

true 和 false

指针字面值

nullptr

练习