在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"我理解,但它如何为双打工作。它是什么类型的十六进制以及什么定义数据部分内的偏移?
答案 0 :(得分:3)
WebAssembly使用IEEE-754对f32
和f64
进行编码。
正在使用ASCII编码的"\00\00\00\00\00\00\f0?"
初始化数据部分。这就是s表达式的作者选择使用的内容,在实际二进制文件中它被编码为4或8个字节(对于f32
对f64
)。我们也可以使用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
值。