Post

C++ 类型

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';
}

最好不要对对象的表现形式作出任何主观假设,对于字符尤其如此。

符号/前缀含义示例
'charc
u'char16_tu'c'
U'char32_tU'c'
L'wchar_tL'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后缀unsigned10U
l L后缀long20000L
ll LL后缀long long20000LL

4. 浮点数类型

  • float: 单精度
  • double: 双精度
  • long double: 扩展精度
符号 含义示例
f F前缀float10F
e E中缀浮点数10e-4
.中缀浮点数1.2

对于大多数应用来说,我们用bool表示布尔值、用char表示字符、用int表示整数值、用double表示浮点数。其他基本类型可以看作是上述类型的变形, 只有当程序在性能优化、兼容性或其他方面有所要求时才会用到;一般情况下,前面四种类型已经足够了。

5. void

  1. 作为函数的返回类型以说明函数不返回任何实际的值。
  2. 作为指针的基本类型部分以表明指针所指的类型对象未知。
1
2
void f();
void *ptr;

6. size

\[1 byte = 8 bit\]

在 C++ 的标准之下,很多重要的功能都是依赖于实现的。大多数依赖于实现的功能都与运行程序的硬件系统密切相关。

C++ 规定char至少占 8 位,short至少占 16 位,long至少占 32 位。

int 的实际类型也是依赖于实现的,并确保是当前机器上最适合保存和操作整数的类型。int 通常占据 4 个byte。

  1. char 通常占据 8 位,但也确实存在 char 占 32 位的机器。
  2. 我们绝不能假定 int 和指针的尺寸一样大,因为在很多机器上(64 位体系结构)指针的尺寸比整数大。
  1. 丢失信息的类型转换。 ↩︎

  2. 双引号内的字符序列。字符串字面值常量实际包含的字符数通常比他表现出来的样子多一个。他以一个取值为 0 的字符 \0 结尾。 ↩︎

This post is licensed under CC BY 4.0 by the author.