C++ 类型
1. 布尔类型
一个布尔变量(bool)的取值或者是 true 或者是 false,常用于表示逻辑运算的结果。 根据定义,当我们把布尔值转换成整数时,true 转为 1,而 false 转为 0。反之,整数值也能在需要的时候隐式地转换成布尔值,其中非 0 整数对应 true,而 0 对应false。
1
2
3
4
5
6
7
8
9
10
11
12
bool b1 = 7;
bool b2{7}; // 错误:发生了窄化转换
int i1 = true;
int i2{true}
bool a = true;
bool b = true;
bool x = a + b; // true
bool y = a || b; // true
bool z = a - b; // false
如果你既想使用 {} 初始化器列表防止窄化转换1的发生,同时又确实想把 int 转换成 bool,可以显示声明如下。
1
2
3
4
void f(int i)
{
bool b{i != 0};
}
如有必要,指针也能被隐式地转换成 bool。其中,非空指针对应 true,值为 nullptr 的指针对应 false。
1
2
3
4
5
6
7
8
void g(int *p)
{
bool b = p; // 窄化成true或false
bool b2{p != nullptr}; // 显式检查指针是否为空
if (p) // 等价于 p != nullptr
{}
}
与
if (p != nullptr)相比,if (p)更好。不但简洁而且直接地表达「p是否有效」的含义,而且使用if (p)也不太容易出错。
2. 字符类型
在C++中,char 类型的大小最少应该是 1 字节(byte)。根据 C++ 标准,char 的大小至少为 1 字节,但在不同的系统或编译器上, 1 字节可能会有不同的具体实现(比如某些平台上可能使用 8 位)。不过,标准规定了 sizeof(char) 始终等于 1。 需要注意的是,char 可以用于存储一个字节的字符数据(通常是 8 位),并且它通常表示 ASCII 字符集中的字符。
1
2
unsigned char c1 = 64; // 定义良好:在任何情况下,char都至少包含8个二进制位(8bit),肯定能存下64
unsigned char c2 = 1256; // 依赖于实现的:如果当前情况下,char只占8位,则值将被截断。char到底占多少位在不同的实现版本中可能不一样。
- char
- 默认字符类型,用于程序文本。
char是 C++ 实现所用的字符集,通常占 8 位。 - signed char
- 与
char类似,但是带有符号;换句话说,他既可以存放正值,也可以存放负值。 - unsigned char
- 与
char类似,但是不带符号 - wchar_t
- 用于存放 Unicode 等更大的字符集。
wchar_t尺寸依赖于实现,确保能够支持实现环境中用到的最大字符集。 - char16_t
- 该类型存放 UTF-16 等 16 位字符集。
- char32_t
- 该类型存放 UTF-32 等 32 位字符集。
在具体的实现版本中,
char类型可能会和signed char或者unsigned char完全等效。但是不论如何,我们还是把这 3 个名字看成完全独立的 3 个类型,我们不能混用指向这 3 种字符类型的指针。
在编程环境所用的字符集中,每个字符都对应一个整数值。
1
2
3
4
5
6
// 查看任意字符对应的整数值
void intval
{
for (char c; cin >> c; )
std::cout << "the value of '" << c << "' is " << int{c} << '\n';
}
最好不要对对象的表现形式作出任何主观假设,对于字符尤其如此。
| 符号/前缀 | 含义 | 示例 |
|---|---|---|
' | char | c |
u' | char16_t | u'c' |
U' | char32_t | U'c' |
L' | wchar_t | L'c' |
" | 字符串 | "mess" |
R" | 原始字符串 | R"(\b)" |
u8" u8R" | UTF-8 字符串 | u8"foo" |
u" uR" | UTF-16 字符串 | u"foo" |
U" UR" | UTF-32 字符串 | U"foo" |
L" LR" | wchar_t 字符串 | L"foo" |
表中的「字符串」是指字符串字面值常量2,而非数据类型 std::string。
3. 整数类型
| 符号 | 含义 | 示例 | |
|---|---|---|---|
0 | 前缀 | 八进制 | 0776 |
0x 0X | 前缀 | 十六进制 | 0xff |
u U | 后缀 | unsigned | 10U |
l L | 后缀 | long | 20000L |
ll LL | 后缀 | long long | 20000LL |
4. 浮点数类型
float: 单精度double: 双精度long double: 扩展精度
| 符号 | 含义 | 示例 | |
|---|---|---|---|
f F | 前缀 | float | 10F |
e E | 中缀 | 浮点数 | 10e-4 |
. | 中缀 | 浮点数 | 1.2 |
对于大多数应用来说,我们用
bool表示布尔值、用char表示字符、用int表示整数值、用double表示浮点数。其他基本类型可以看作是上述类型的变形, 只有当程序在性能优化、兼容性或其他方面有所要求时才会用到;一般情况下,前面四种类型已经足够了。
5. void
- 作为函数的返回类型以说明函数不返回任何实际的值。
- 作为指针的基本类型部分以表明指针所指的类型对象未知。
1
2
void f();
void *ptr;
6. size
\[1 byte = 8 bit\]在 C++ 的标准之下,很多重要的功能都是依赖于实现的。大多数依赖于实现的功能都与运行程序的硬件系统密切相关。
C++ 规定char至少占 8 位,short至少占 16 位,long至少占 32 位。
int 的实际类型也是依赖于实现的,并确保是当前机器上最适合保存和操作整数的类型。int 通常占据 4 个byte。
char通常占据 8 位,但也确实存在char占 32 位的机器。- 我们绝不能假定
int和指针的尺寸一样大,因为在很多机器上(64 位体系结构)指针的尺寸比整数大。