类型转换 (Casting)
Zig 对类型转换(Casting)和类型强制转换(Type Coercion)有严格的规则,旨在提高类型安全和代码可读性。
类型强制转换 (Type Coercion)
Zig 编译器在某些情况下会执行隐式的类型强制转换,通常是为了方便且安全的操作。
更严格的限定 (Stricter Qualification)
*T可以强制转换为*const T。[]T可以强制转换为[]const T。[N]T可以强制转换为[]T。
整数和浮点数拓宽 (Integer and Float Widening)
小整数类型可以安全地强制转换为大整数类型(例如 u8 到 u16),而不会丢失信息。
小浮点类型可以安全地强制转换为大浮点类型(例如 f32 到 f64)。
浮点数到整数 (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_int 和 comptime_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