如何在 Zig 中(不安全地)从“u64”投射到“i64”?

How do I (unsafely) cast from `u64` to `i64` in Zig?

提问人:iafisher 提问时间:7/6/2023 更新时间:8/8/2023 访问量:314

问:

我有一个值,我需要将其转换为。、 和 都会导致编译器错误,因为并非所有值都适合 。这很公平,但在这种情况下,我需要一个,并且我愿意接受错误/崩溃,以防万一该值不合适。Zig 是否有函数或运算符来执行此操作?u64i64@as@intCast@truncateu64i64i64

急转

评论

1赞 Ali Chraghi 7/6/2023
@as(i64, @intCast(value))应该只是工作。
0赞 iafisher 7/6/2023
为什么这有效但无效?@intCast(i64, value)
0赞 Dylan Reimerink 7/6/2023
ziglang.org/documentation/0.10.1/#intCast 因为 u64 的值可能超出了 i64 的范围,因此无法保证获得相同的数值
1赞 Ali Chraghi 7/8/2023
@intCast(i64, value)语法无效

答:

2赞 sigod 8/8/2023 #1

在 0.11 中,@intCast(和其他一些)的语法略有变化

@intCast不再采用类型参数。相反,您必须依赖结果位置语义

  • const x: T = e给出的结果类型为eT
  • @as(T, e)给出的结果类型为eT
  • return e给出函数返回类型的结果类型e
  • S{ .f = e }给出字段类型的结果类型eS.f
  • f(e)给出第一个参数类型的结果类型ef

例如:

const result: i64 = @intCast(value);

const result = @as(i64, @intCast(value));