2.1 基本内置类型
C++定义了一套包括算数类型(arithmetic type)和空类型(void)在内的基本数据类型。其中算数类型包含了字符、整型数、布尔值和浮点数。空类型不对应具体的值,仅用于一些特殊的场合,例如最常见的是,当函数不返回任何值时,使用空类型作为返回类型。
2.1.1算数类型
算数类型分为两类:整型(integral type,包括字符和布尔类型在内)和浮点型。
算数类型的尺寸(也就是该类型数据所占的比特数)在不同机器上有所差别。表2.1列出了C++标准规定的尺寸的最小值,同时允许编译器赋予这些类型更大的尺寸。某一类型所占的比特数不同,他所能表示的数据范围也不一样。
类型 | 含义 | 最小尺寸 |
---|---|---|
bool | 布尔类型 | 未定义 |
char | 字符 | 8位 |
wchar_t | 宽字符 | 16位 |
char16_t | Unicode字符 | 16位 |
char32_t | Unicode字符 | 32位 |
short | 短整型 | 16位 |
int | 整型 | 16位 |
long | 长整型 | 32位 |
long long | 长整型 | 64位 |
float | 单精度浮点数 | 6位有效数字 |
double | 双精度浮点数 | 10位有效数字 |
long double | 扩展精度浮点数 | 10位有效数字 |
建议:如何选择类型
- 当明确知晓数值不可能为负时,选用无符号类型。
- 使用int执行整数运算。在实际应用中,short 常常显得太小而 long 一般和 int 有一样的尺寸。如果你的数值超过了 int 的标识范围,选用 long long。
- 在算数表达式中不要使用char或bool,只有在存放字符或布尔值时才使用它们。因为类型 char 在一些机器上是有符号的,而在另一些机器上又是无符号的,所以如果 char 进行运算特别容易出问题。如果你需要使用一个不大的整数,那么明确指定它的类型是 signed char 或者 unsigned char。
- 执行浮点数运算选用 double,这是因为 float 通常精度不够而且双精度浮点数和单精度浮点数的计算代价相差无几。事实上,对于某些机器来说,双精度发运算甚至比单精度还快。long double 提供的精度在一般情况下是没有必要的,况且它带来的运行时损耗也不容忽视。
2.1.3 字面值常量
指定字面值的类型
通过前缀和后缀可以改变整型、浮点型和字符型字面值的默认类型
L'a' | 宽字符型字面值,类型是 wchar_t |
u8"hi!" | utf-8 字符串字面值( utf-8 用 8 位编码一个Unicode字符) |
42ULL | 无符号整型字面值,类型是 unsigned long long |
1E-3F | 当精度浮点型字面值,类型是float |
3.14159L | 扩展精度浮点型字面值,类型是 long double |
前缀 | 含义 | 类型 |
---|---|---|
u | Unicode 16 字符 | char16_t |
U | Unicode 32 字符 | char32_t |
L | 宽字符 | wchar_t |
u8 | UTF-8(仅用于字符串字面常量) | char |
后缀 | 最小匹配类型 |
---|---|
u or U | unsigned |
l or L | long |
ll or LL | long long |
后缀 | 类型 |
---|---|
f or F | float |
l or L | long double |
布尔字面值和指针字面值
true 和 false 是布尔类型的字面值:
bool test = false;
nullptr 是指针字面值(2.3.2节将有更多关于指针和指针字面值的介绍)