"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为单位):

Memory Addressing

"题外话"

在一些老的或者非标的计算机上,一个字节可能表示不同长度的比特(1 到 48 比特都有可能)—— 不过,你通常不需要担心这个问题,因为现代计算机的事实标准就8比特,我们可以假设1个字节就是8个比特。

数据类型

由于计算机上所有的数据都只是一些连续的比特,我们必须要使用数据类型(通常简称为类型)告诉计算机如何将内存中的数据解析为有意义的值。我们已经学习了一种数据类型:整型。当一个整型变量被定义时,我们告诉计算机”该变量使用的这一段内存需要被解析为一个整型值“。

当为一个对象进行赋值时,编译器和CPU会将这个值编码成一系列连续的 bit然后存放到内存中(注意:内存只能存放比特)。例如,如果你将一个整型的对象赋值为65,则该值会被转换为 0100 0001 后存放在内存关联的地址中。

反过来,当对象被求值时,这些连续的 bit 会被重新组织成原来的值,即 0100 0001 会被转换为 65。

幸运的是,编译器和CPU会帮助我们完成上述工作,我们通常不需要担心这些值是如何被转换的。

我们的工作仅仅是为变量指定一个我们需要的值。

基本数据类型

C++ 具有很多内置的数据类型,称为基础数据类型,也经常被称为基本类型、原始类型或内置类型。

下表是一些基本数据类型,有些可能你已经见过了:

类型分类含义例子
floatFloating Pointa number with a fractional part3.14159
doubleFloating Pointa number with a fractional part3.14159
long doubleFloating Pointa number with a fractional part3.14159
boolIntegral (Boolean)true or falsetrue
charIntegral (Character)a single character of text‘c’
wchar_tIntegral (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’
shortIntegral (Integer)positive and negative whole numbers, including 064
intIntegral (Integer)positive and negative whole numbers, including 064
longIntegral (Integer)positive and negative whole numbers, including 064
long long (C++11)Integral (Integer)positive and negative whole numbers, including 064
std::nullptr_t (C++11)Null Pointera null pointernullptr
voidVoidno typen/a

本章将相继介绍这些基本数据类型(除了 std::nullptr_t,我们会在讨论指针时讨论它)。C++ 也支持很多复杂类型,称为复合类型,我们会在后续的章节中进行介绍。

"作者注"

术语整型(interger)和整数的(integral)类似,但是意思并不完全相同。整型指的是一种用于存放非小数值的特定的数据结构,例如整数、0或者负整数。而整数型的则表示“像整型”。多数情况下,整型的一词被组成其他术语,例如“整数型的类型”,包括布尔类型、字符和整型(还包括枚举——在第九章会进行介绍)。“整数型的类型”之所以这么命名,是因为这些类型的数据在内存中是以整型数存放的,即使它们的行为可能不同(稍后我们会在讨论字符类型时了解其差异)。

"作者注"

大多数现代编程语言都包含基本的字符串类型(字符串指的是包含一系列字符的数据,通常用来表示文本)。在C++中,字符串并不属于基本类型(它属于复合类型)。但是因为字符串的使用方法很直接,而且也非常有用,因此在本章中我们也会介绍字符串类型(4.13 - std::string 简介)。

The _t suffix

很多在新版本 C++ 中定义的数据类型(例如 std::nullptr_t)都包含一个_t后缀。这个后缀表示 type(类型),这是一种常见的用于现代类型的命名方式。

如果你遇到了带有_t后缀的标识符,它很可能是一个类型,但是也有很多类型是不包含该后缀的,所以该命名规则并不是被一贯遵守的。