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

最佳答案

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

数据段正在使用"\00\00\00\00\00\00\f0?"初始化,该代码为ASCII编码。这就是s-expressions的作者选择使用的方式,在实际的二进制文件中,它被编码为4或8个字节(对于f32f64)。我们还可以使用十六进制浮点数作为C / C ++支持,我们只需要无损编码(而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值。

关于webassembly - 如何在Webassembly中生成double的数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43528626/

10-10 17:53