【问题标题】:Webassembly wrap instruction: Meaning of i % 2^32Webassembly wrap 指令:i % 2^32 的含义
【发布时间】:2021-08-11 19:48:53
【问题描述】:

我正在用 Java 编写一个 Webassembly 运行时。一条指令是i32.wrap_i64指令,定义为

返回 i 模 2^N 。

(其中 N = 32)并且应该将 64 位整数转换为 32 位整数(参见 op-wrap)。

很遗憾,我无法理解这一点。我当然可以写

return (int) (i % (1 << 32))

但是 IntelliJ 已经暗示这整个表达式可以被 0 替换,如果我执行它,这也是结果。

当然,这不是指令应该是什么,但它应该是什么? 2^32 是一个很大的数字,在这里没有多大意义。我想它应该是一些位的东西,但是什么?

【问题讨论】:

  • 只有低 32 位。

标签: java webassembly


【解决方案1】:

让我们考虑一下:

   return (int) (i % (1 << 32))

1 &lt;&lt; 32 中,左边的操作数是一个int,所以右边的操作数是reduced modulo 32。因此它实际上是1 &lt;&lt; 0,即1。

所以我们现在有i % 1,或者是i 除以1 的余数,对于i 的所有值,该余数为零。

你可以通过写作来挽救这个

   return (int) (i % (1L << 32))

但我觉得写起来更清楚

   return (int) (i & 0xffffffffL)

因为除以 2-to-the-N 的余数只是 N 个低位, Java 中的 N=32(int 的大小)reduces to just the cast

   return (int)i;

【讨论】:

    猜你喜欢
    • 2018-01-11
    • 2020-08-15
    • 2018-06-08
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 2017-10-14
    • 2013-10-18
    • 2011-12-29
    相关资源
    最近更新 更多