webassembly中double的数据是如何生成的?

How is the data generated for a double in webassembly?

在 Webassembly 中如下:

double x = 1;

类似于此 WAST:

(module
  (table 0 anyfunc)
  (memory [=11=] 1)
  (data (i32.const 16) "[=11=][=11=][=11=][=11=][=11=][=11=]\f0?")
  (export "memory" (memory [=11=]))
)

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

例如,整数 15 等价于:“[=23=]f[=23=][=23=][=23=]”,我理解,但它如何适用于双打。它是什么类型的十六进制,什么定义了数据部分内的偏移量?

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

WebAssembly 使用 IEEE-754 编码 f32f64.

正在使用 ASCII 编码的 "[=13=][=13=][=13=][=13=][=13=][=13=]\f0?" 初始化数据部分。这正是 s 表达式的作者选择使用的,在实际的二进制文件中它被编码为 4 或 8 个字节(f32f64)。我们也可以使用 hex-float 作为 C/C++ 支持,我们只需要一个无损编码(而 hex-float 对 NaN 是有损的)。另一种选择是 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