Webassembly 换行指令:i % 2^32 的含义
Webassembly wrap instruction: Meaning of i % 2^32
我正在 Java 中编写 Webassembly 运行时。一条指令是i32.wrap_i64
指令,定义为
Return i modulo 2^N .
(N = 32)并且应该将 64 位整数转换为 32 位整数(参见 op-wrap)。
很遗憾,我无法理解这一点。我当然可以只写
return (int) (i % (1 << 32))
但 IntelliJ 已经提示整个表达式可以用 0 替换,这也是我执行它的结果。
当然,这不是指令的内容,但它应该是什么? 2^32 是一个很大的数字,在这里没有多大意义。我想它应该是位明智的,但是什么?
让我们考虑一下:
return (int) (i % (1 << 32))
在1 << 32
中,左边的操作数是一个int,所以右边的操作数是reduced modulo 32。因此它实际上是 1 << 0
,即 1.
所以我们现在有 i % 1
,或者 i
除以 1 的余数,对于 i
的所有值都为零。
你可以通过写
来挽救这个
return (int) (i % (1L << 32))
不过我觉得这样写比较清楚
return (int) (i & 0xffffffffL)
因为2除以N的余数就是N个低位,
对于 Java reduces to just the cast
中的 N=32(int 的大小)
return (int)i;
我正在 Java 中编写 Webassembly 运行时。一条指令是i32.wrap_i64
指令,定义为
Return i modulo 2^N .
(N = 32)并且应该将 64 位整数转换为 32 位整数(参见 op-wrap)。
很遗憾,我无法理解这一点。我当然可以只写
return (int) (i % (1 << 32))
但 IntelliJ 已经提示整个表达式可以用 0 替换,这也是我执行它的结果。
当然,这不是指令的内容,但它应该是什么? 2^32 是一个很大的数字,在这里没有多大意义。我想它应该是位明智的,但是什么?
让我们考虑一下:
return (int) (i % (1 << 32))
在1 << 32
中,左边的操作数是一个int,所以右边的操作数是reduced modulo 32。因此它实际上是 1 << 0
,即 1.
所以我们现在有 i % 1
,或者 i
除以 1 的余数,对于 i
的所有值都为零。
你可以通过写
来挽救这个 return (int) (i % (1L << 32))
不过我觉得这样写比较清楚
return (int) (i & 0xffffffffL)
因为2除以N的余数就是N个低位, 对于 Java reduces to just the cast
中的 N=32(int 的大小) return (int)i;