第五章:基本值与数据
级别 1 — 入门
所有计算的基础:类型、值,以及 C 和 Auto 如何表示数据。
这是级别 1 中最重要的章节。你在 C 或 Auto 中构建的一切都建立在对语言如何在内存中表示值的理解之上。我们将涵盖抽象机器模型、基本类型、转换、初始化器、命名常量和二进制表示。
5.1 抽象状态机
C 深入: C 标准并不描述一台物理计算机。相反,它定义了一个抽象状态机,规定了符合标准的程序必须做什么。真实编译器的工作是生成代码,使其表现得就像抽象状态机执行了该程序一样。
抽象状态机包括:
- 对象——保存值的存储区域(变量、分配的内存)。
- 值——存储在对象中的位模式,根据其类型进行解释。
- 副作用——机器状态的改变(写入变量、调用 I/O 函数)。
- 序列点——保证所有先前副作用完成的时刻。
当你写 int x = 42; 时,抽象状态机:
- 为名为
x的对象分配存储空间。 - 确定其类型为
int。 - 将值
42存储在该对象中。
Auto 通过移除未定义行为简化了这个模型。如果 Auto 程序能编译,它就有明确定义的语义。代价是 Auto 隐藏了 C 暴露的某些机器级细节(如原始指针算术和精确的对象布局)。
要点: C 的抽象状态机是你和编译器之间的契约。遵守契约,你的代码就是可移植和可预测的。违反它(例如通过未定义行为),编译器可以做任何事。
5.2 基本类型
C 有一组小但精细的基本类型。Auto 将它们映射到更清晰的子集:
| C 类型 | Auto 类型 | 典型大小 | 备注 |
|---|---|---|---|
char | char | 1 字节 | 字符或小整数 |
signed char | i8 | 1 字节 | 显式有符号 8 位 |
unsigned char | u8 | 1 字节 | 无符号 8 位 |
short | i16 | 2 字节 | 短整数 |
int | int | 4 字节 | 默认整数 |
long | i64 | 4 或 8 字节 | 平台相关 |
long long | i64 | 8 字节 | 至少 64 位 |
float | float | 4 字节 | 单精度 IEEE 754 |
double | float | 8 字节 | 双精度;Auto 用 float 统一表示 |
_Bool | bool | 1 字节 | C99 布尔;Auto 有 bool |
size_t | usize | 4 或 8 字节 | 无符号,sizeof 结果 |
主要区别:
- C 的
double与float是不同的类型。 Auto 将它们统一为float,让编译器选择精度。 - C 的每种整数类型都有有符号/无符号变体。 Auto 默认有符号,提供显式的
u8、u16、u32、u64用于无符号需求。 - C 的
char可能是有符号或无符号的,取决于平台。Auto 将char视为仅用于字符数据的独立类型。