4.1 - 基础数据类型简介
Key Takeaway
- 变量只是一段可以存放信息的内存的名称
- 使用数据类型(通常简称为类型)告诉计算机如何将内存中的数据解析为有意义的值
- 一个byte通常等于8个bit
- “整数型的类型”,包括布尔类型、字符、整型和枚举
- 字符串不属于 C++ 的基本类型,它属于复合类型,由
std::string
定义
Bits、bytes 和内存地址
在1.3 - 对象和变量中我们介绍过,事实上变量只是一段可以存放信息的内存的名称。简单回忆一下,程序可以使用计算机提供的随机访问内存(RAM)。当变量被定义的时候,一块内存被关联到了该变量。
内存的最小单元是一个二进制位(也称为 位),它可以存储 0 或 1.你可以把一个比特看成是一个灯泡的开关——它只有开(1)和关(0)两种状态,没有其他任何中间状态。如果你去观察一段内存内容的话,你总能看到 …011010100101010… 或其他类似组合。
我们将内存分割成一系列连续的单元,称为内存地址。类似于街道地址可以用来查找街道上某幢建筑,通过内存地址我们也可以找到特定地址中存放的内容。
不够有件事可能出乎你的意料,对于现代计算机体系结构来说,计算机内存中的bit并不都具有一个唯一的地址。这是因为内存地址的数量是有限的,而且也并不需要为每个bit都指定一个唯一的地址。实际上,每个内存地址表示一个字节的地址。一个字节表示一组被作为一个单元操作的比特。一般来讲(现代计算机)一个字节包含8个连续的 bit。
关键信息
在 C++,我们通常以 byte 为单位操作数据。
下图显示了一些内存地址及其内部存放的数据(byte为单位):
题外话
在一些老的或者非标的计算机上,一个字节可能表示不同长度的比特(1 到 48 比特都有可能)—— 不过,你通常不需要担心这个问题,因为现代计算机的事实标准就8比特,我们可以假设1个字节就是8个比特。
数据类型
由于计算机上所有的数据都只是一些连续的比特,我们必须要使用数据类型(通常简称为类型)告诉计算机如何将内存中的数据解析为有意义的值。我们已经学习了一种数据类型:整型。当一个整型变量被定义时,我们告诉计算机”该变量使用的这一段内存需要被解析为一个整型值“。
当为一个对象进行赋值时,编译器和CPU会将这个值编码成一系列连续的 bit然后存放到内存中(注意:内存只能存放比特)。例如,如果你将一个整型的对象赋值为65,则该值会被转换为 0100 0001 后存放在内存关联的地址中。
反过来,当对象被求值时,这些连续的 bit 会被重新组织成原来的值,即 0100 0001 会被转换为 65。
幸运的是,编译器和CPU会帮助我们完成上述工作,我们通常不需要担心这些值是如何被转换的。
我们的工作仅仅是为变量指定一个我们需要的值。
基本数据类型
C++ 具有很多内置的数据类型,称为基础数据类型,也经常被称为基本类型、原始类型或内置类型。
下表是一些基本数据类型,有些可能你已经见过了:
类型 | 分类 | 含义 | 例子 |
---|---|---|---|
float | Floating Point | a number with a fractional part | 3.14159 |
double | Floating Point | a number with a fractional part | 3.14159 |
long double | Floating Point | a number with a fractional part | 3.14159 |
bool | Integral (Boolean) | true or false | true |
char | Integral (Character) | a single character of text | ‘c’ |
wchar_t | Integral (Character) | a single character of text | ‘c’ |
char8_t (C++20) | Integral (Character) | a single character of text | ‘c’ |
char16_t (C++11) | Integral (Character) | a single character of text | ‘c’ |
char32_t (C++11) | Integral (Character) | a single character of text | ‘c’ |
short | Integral (Integer) | positive and negative whole numbers, including 0 | 64 |
int | Integral (Integer) | positive and negative whole numbers, including 0 | 64 |
long | Integral (Integer) | positive and negative whole numbers, including 0 | 64 |
long long (C++11) | Integral (Integer) | positive and negative whole numbers, including 0 | 64 |
std::nullptr_t (C++11) | Null Pointer | a null pointer | nullptr |
void | Void | no type | n/a |
本章将相继介绍这些基本数据类型(除了 std::nullptr_t
,我们会在讨论指针时讨论它)。C++ 也支持很多复杂类型,称为复合类型,我们会在后续的章节中进行介绍。
作者注
术语整型(interger)和整数的(integral)类似,但是意思并不完全相同。整型指的是一种用于存放非小数值的特定的数据结构,例如整数、0或者负整数。而整数型的则表示“像整型”。多数情况下,整型的一词被组成其他术语,例如“整数型的类型”,包括布尔类型、字符和整型(还包括枚举——在第九章会进行介绍)。“整数型的类型”之所以这么命名,是因为这些类型的数据在内存中是以整型数存放的,即使它们的行为可能不同(稍后我们会在讨论字符类型时了解其差异)。
作者注
大多数现代编程语言都包含基本的字符串类型(字符串指的是包含一系列字符的数据,通常用来表示文本)。在C++中,字符串并不属于基本类型(它属于复合类型)。但是因为字符串的使用方法很直接,而且也非常有用,因此在本章中我们也会介绍字符串类型(4.13 - std::string 简介)。
The _t
suffix
很多在新版本 C++ 中定义的数据类型(例如 std::nullptr_t
)都包含一个_t
后缀。这个后缀表示 type(类型),这是一种常见的用于现代类型的命名方式。
如果你遇到了带有_t
后缀的标识符,它很可能是一个类型,但是也有很多类型是不包含该后缀的,所以该命名规则并不是被一贯遵守的。