4-1 基础数据类型介绍

位、字节与内存寻址

在第1.3课——对象与变量介绍中,我们提到变量是用于存储信息的内存区域的名称。简而言之,计算机拥有供程序使用的随机存取存储器(RAM)。当定义变量时,系统会为该变量预留一段内存空间。

内存的最小单位是二进制位binary digit(也称比特bit),可存储0或1的值。可将比特类比为传统电灯开关——要么熄灭(0),要么点亮(1),不存在中间状态。若观察内存的任意片段,你看到的将是……011010100101010……或类似的组合序列。

内存被组织为连续的单元,称为内存地址memory addresses(简称地址addresses)。如同街道地址能定位特定房屋,内存地址使我们能够定位并访问特定位置的内存内容。

令人意外的是,在现代计算机架构中,每个比特并不拥有独立的内存地址。这是因为内存地址数量有限,且逐比特访问数据的需求极为罕见。相反,每个内存地址存储1字节数据。字节byte是作为整体进行运算的比特集合,现代标准规定字节由8个连续比特组成。

关键洞见
在C++中,我们通常处理的是“字节大小byte-sized”的数据块。

下图展示了若干连续内存地址及其对应的数据字节:

image

顺带一提……
某些较旧或非标准的机器可能采用不同大小的字节(从1位到48位不等)——不过我们通常无需为此担忧,因为现代事实标准已将字节定义为8位。在本教程中,我们将始终假设字节为8位。


数据类型

由于计算机中的所有数据本质上都是位序列,我们使用数据类型data type(通常简称为类型type)来告知编译器如何以某种有意义的方式解释内存中的内容。你已经见过一种数据类型的例子:整数。当我们将变量声明为整数时,就是在告诉编译器“该变量占用的内存区域将被解释为整数值”。

当你为对象赋值时,编译器和CPU会自动将该值编码为该数据类型的对应位序列,并存储在内存中(请记住:内存只能存储位)。例如,若将整数对象赋值为65,该值会被转换为位序列0100 0001并存储在对象对应的内存区域。

反之,当对象被求值产生数值时,该位序列会重新组合为原始数值。即0100 0001将转换回数值65。

值得庆幸的是,编译器和CPU承担了所有繁重工作,因此您通常无需担心数值如何转换为位序列及反向转换的过程。

你只需为对象选择最符合使用需求的数据类型即可。


基本数据类型

C++语言内置了多种预定义数据类型供您使用。其中最基础的类型被称为基本数据类型fundamental data types(非正式场合有时也称为基础类型basic types原始类型primitive types)。

以下是基本数据类型的列表,其中部分类型您已经见过:

Types Category Meaning Example
float
double
long double
Floating Point a number with a fractional part 3.14159
bool Integral (Boolean) true or false true
char
wchar_t
char8_t (C++20)
char16_t (C++11)
char32_t (C++11)
Integral (Character) a single character of text 'c'
short int
int
long int
long long int (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外,该类型将在讨论指针时另行说明)。


整数与整数的类型的区别

在数学中,“整数Integer”是指不含小数或分数部分的数,包括正数、负数和零。“整数的integral”一词有多种含义,但在C++语境中意指“类似整数”。

C++标准定义了以下术语:

标准整数类型standard integer types包括short、int、long、long long(含其有符号与无符号变体)。

整数的类型integral types包括 bool、各类 char 类型以及标准整数类型。

所有整数类型在内存中均以整数值存储,但仅标准整数类型在输出时会显示为整数值。关于 bool 和 char 类型在输出时的表现,我们将在各自章节中讨论。

C++ 标准还明确指出“整数类型integer types”与“整数的类型integral types”是同义词。但惯例上,“整数类型integer types”更常作为“标准整数类型standard integer types”的简称使用。

另需注意,“整数的类型integral types”仅包含基本类型。这意味着非基本类型(如枚举类型和枚举类)不属于整数类型,即使它们以整数形式存储(枚举类型在输出时亦如此)。


其他类型集

C++包含三类类型集。

前两类是语言本身的内置类型(使用时无需包含头文件):

  • 基本数据类型fundamental data types”提供了最基础且必不可少的数据类型。
  • 复合数据类型compound data types”提供更复杂的数据结构,并支持创建自定义(用户定义)类型。相关内容详见第12.1节——复合数据类型介绍

基础类型fundamental types复合类型compound types的区分意义不大,通常可将其视为单一类型集。

第三类(也是最大的一类)类型由C++标准库提供。由于标准库包含在所有C++发行版中,这些类型具有广泛可用性且经过标准化以确保兼容性。使用标准库中的类型需要包含相应的头文件并链接标准库。

术语定义
术语“内置类型built-in type”通常被用作基本数据类型的同义词。然而,Stroustrup等人使用该术语时,既指基本数据类型也指复合数据类型(二者均内置于核心语言中)。由于该术语定义不明确,我们建议相应地避免使用它。

在上表列出的基本类型中,有一个值得注意的遗漏——用于处理字符串strings(通常用于表示文本的字符序列)的数据类型。这是因为在现代C++中,字符串属于标准库的一部分。虽然本章将重点探讨基本类型,但鉴于基础字符串的使用既简单又实用,我们将在下一章(第5.7节——std::string介绍)中介绍字符串。


_t 后缀

C++ 新版本中定义的许多类型(例如 std::nullptr_t)都使用 _t 后缀。该后缀表示“类型”,是现代类型中常用的命名规范。

若遇到带有 _t 后缀的名称,通常可视为类型。但需注意,并非所有类型都使用该后缀,因此此规则并非绝对适用。

posted @ 2026-02-13 06:28  游翔  阅读(1)  评论(0)    收藏  举报