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