类型转换 (Casting)

Zig 对类型转换(Casting)和类型强制转换(Type Coercion)有严格的规则,旨在提高类型安全和代码可读性。

类型强制转换 (Type Coercion)

Zig 编译器在某些情况下会执行隐式的类型强制转换,通常是为了方便且安全的操作。

更严格的限定 (Stricter Qualification)

  • *T 可以强制转换为 *const T
  • []T 可以强制转换为 []const T
  • [N]T 可以强制转换为 []T

整数和浮点数拓宽 (Integer and Float Widening)

小整数类型可以安全地强制转换为大整数类型(例如 u8u16),而不会丢失信息。 小浮点类型可以安全地强制转换为大浮点类型(例如 f32f64)。

浮点数到整数 (Float to Int)

浮点数到整数的强制转换在运行时会检查溢出。如果发生溢出,会引发非法行为(Debug 和 ReleaseSafe 模式下 panic)。

切片、数组和指针 (Slices, Arrays and Pointers)

  • [N]T 可以强制转换为 []T
  • [N:0]u8 (null 终止数组) 可以强制转换为 [:0]const u8 (null 终止切片)。

可选类型 (Optionals)

非可选类型 T 可以强制转换为可选类型 ?T

错误联合 (Error Unions)

成功值 T 可以强制转换为错误联合 E!T

编译时已知数字 (Compile-Time Known Numbers)

comptime_intcomptime_float 可以强制转换为任何可以表示其值的具体数字类型。

显式类型转换 (Explicit Casts)

使用 @intCast, @floatCast, @bitCast 等内建函数进行显式的类型转换。

const x: i32 = 10;
const y: u32 = @intCast(x); // 显式整数转换

const z: f32 = 3.14;
const w: i32 = @floatToInt(z); // 显式浮点数到整数转换

对等类型解析 (Peer Type Resolution)

当多个类型混合在同一个表达式中时,Zig 会尝试找到一个共同的“对等类型”。

const a = 1; // 类型推断为 comptime_int
const b: i32 = 2;
const sum = a + b; // sum 的类型为 i32

另请参阅: