如何在webassembly中为double生成数据?

时间:2017-04-20 19:48:25

标签: webassembly

在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/进行测试。

1 个答案:

答案 0 :(得分:3)

WebAssembly使用IEEE-754对f32f64进行编码。

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

这解码为十六进制3FF000000000。为什么?最后有?,其ASCII值为3F。然后,您拥有所有转义的ASCII值,这些值不具有更好的表示,因此使用转义编码。它真的不是一个伟大的代表!

这是什么意思?试用this tool来理解IEEE-754编码!

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

因此符号为正,指数为0,有效数为1.0。这是IEEE-754中的1.0值。