4

在 Webassembly 中如下:

double x = 1;

类似于此 WAST:

(module
  (table 0 anyfunc)
  (memory $0 1)
  (data (i32.const 16) "\00\00\00\00\00\00\f0?")
  (export "memory" (memory $0))
)

我已经弄清楚了它如何处理整数(通过使用十六进制数字),但我看到的双精度不是我熟悉的通常的十六进制。

例如,整数 15 等价于:“\0f\00\00\00”,我理解,但它对双打是如何工作的。它是什么类型的十六进制,什么定义了数据部分内的偏移量?

我正在使用https://mbebenita.github.io/WasmExplorer/进行测试。

4

1 回答 1

4

WebAssembly 使用 IEEE-754 编码f32f64.

正在使用"\00\00\00\00\00\00\f0?"ASCII 编码初始化数据部分。这正是 s-expressions 的作者选择使用的,在实际的二进制文件中,它被编码为 4 或 8 个字节(对于f32vs f64)。我们也可以使用 hex-float 作为 C / C++ 支持,我们只需要无损编码(并且 hex-float 对 NaN 是有损的)。另一种选择是base64,或原始十六进制,或其他。数据部分不关心它包含什么数据类型:在二进制格式中,它只是字节。所以我们并没有真正编码浮点值或整数,只是字节。

这解码为 hex 3FF000000000。为什么??末尾有一个,它的 ASCII 值是3F. 然后你有所有没有更好表示的转义 ASCII 值,因此使用转义编码。这真的不是一个很好的代表!

这是什么意思?试试这个工具来理解 IEEE-754 编码!

Binary64: 3FF0000000000000
Status  Sign [1]    Exponent [11]   Significand [52]
Normal  0 (+)       01111111111 (0) 1.0000000000000000000000000000000000000000000000000000 (1.0)

所以符号为正,指数为0,有效数为1.0。这就是1.0IEEE-754 中的价值。

于 2017-04-20T19:58:42.827 回答