Skip to content

19.1 补充:理解位与字节

在 2.1 节我们提到了整数类型的“最小宽度”和“字节数”,这对于初学者来说可能有些抽象。本节将详细解释这些计算机底层的基本概念,帮助你彻底理解 C++ 中数据类型的大小。

计算机底层是由无数个开关组成的,每个开关只有两种状态:开(1)或关(0)。

  • 位(Bit,简写为小写 b):计算机存储数据的最小基本单位。一个位只能存储一个 01
  • 字节(Byte,简写为大写 B):计算机处理数据的基本单位。在绝大多数现代计算机中,1 个字节等于 8 个位1 Byte = 8 bits)。

想象一下,1 个位就像一个只能显示 0 或 1 的单个数字显示器。如果你有 8 个这样的显示器排成一排(1 个字节),你能表示多少种不同的组合呢? 答案是 28=2562^8 = 256 种。这就意味着,1 个字节最多可以表示 256 个不同的数值(例如,从 0 到 255)。

数据类型的“宽度”与“大小”

Section titled “数据类型的“宽度”与“大小””

当我们谈论 C++ 中数据类型的宽度(Width)时,我们指的是它占用多少个位(Bit)。 当我们谈论大小(Size)时,通常是指它占用多少个字节(Byte)

例如,2.1 节的表格中提到:

  • short 的最小宽度是 16 位:这意味着一个 short 类型的变量至少要占用 16 个位,也就是 16 / 8 = 2 个字节。因此,它能表示的数值范围是 2^{16} = 65,536 个数值(有符号的情况下是一半正数一半负数:-32,768 到 32,767)。
  • int 的最小宽度也是 16 位:等等,这看起来很奇怪!为什么 intshort 一样?

在 C++ 中,标准并没有直接强制规定某种类型必须精确等于多少个字节。相反,C++ 标准只规定了它们的最小宽度(Minimum Width)和相对大小关系

C++ 标准的强制要求是:

  1. 1 == sizeof(char)
  2. sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)

为什么 C++ 要这样设计?

因为 C++ 被设计为可以在各种各样的硬件平台上运行:从老旧的 16 位微控制器(如早期的单片机),到 32 位的个人电脑,再到如今主流的 64 位服务器。

  • 在早期的 16 位系统上,为了保证性能,int 通常就是 16 位(2 字节)。
  • 在常见的 32 位和 64 位 Windows/Linux 电脑上,int 的“典型大小”变成了 32 位(4 字节),这样能支持更大的数值(大约 -21 亿到 21 亿)。

所以,“最小宽度为 16 位”是 C++ 标准给编译器的底线要求:不管你是什么平台,你的 int 类型绝不能小于 16 位。但在你现在使用的现代电脑上,编译器为了性能和实际需求,给 int 分配了 32 位(4 字节)。

确切知道大小的类型:固定宽度整数(C++11)

Section titled “确切知道大小的类型:固定宽度整数(C++11)”

因为基本整数类型(如 int, long)在不同电脑上的大小可能会变缩,这在某些需要精确控制内存或网络传输数据的场景下是个头疼的问题。

为了解决这个问题,C++11 引入了固定宽度整数类型(Fixed-width integer types)。你需要包含 <cstdint> 头文件来使用它们。

它们的名字非常直白,直接告诉你确切占用了多少位:

  • int8_t / uint8_t :精确的 8 位(1 字节),有符号 / 无符号
  • int16_t / uint16_t :精确的 16 位(2 字节),有符号 / 无符号
  • int32_t / uint32_t :精确的 32 位(4 字节),有符号 / 无符号
  • int64_t / uint64_t :精确的 64 位(8 字节),有符号 / 无符号
#include <iostream>
#include <cstdint> // 引入固定宽度整数
int main() {
int32_t exact_32_bit_num = 100000; // 在任何支持的平台上都绝对是 32 位 (4字节)
int standard_int = 100000; // 在现代 PC 上通常也是 32 位,但不提供绝对保证
std::cout << "int32_t size: " << sizeof(exact_32_bit_num) << " bytes\n";
std::cout << "standard int size: " << sizeof(standard_int) << " bytes\n";
return 0;
}
  1. 位(Bit)是最小状态(0或1),字节(Byte)是存储基本单位(通常 1 Byte = 8 Bits)。
  2. C++ 标准只规定了类型的最小位数和相对大小,不规定绝对字节数,为了跨平台兼容性。
  3. 在现代电脑上,通常 int 是 4 字节(32位),long long 是 8 字节(64位)。
  4. 如果你需要确切的字节数(例如处理硬件或网络协议),请使用 <cstdint> 中的 int32_t 等固定宽度类型。