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 编码 f32
和 f64
.
正在使用 ASCII 编码的 "[=13=][=13=][=13=][=13=][=13=][=13=]\f0?"
初始化数据部分。这正是 s 表达式的作者选择使用的,在实际的二进制文件中它被编码为 4 或 8 个字节(f32
与 f64
)。我们也可以使用 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
。
在 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 编码 f32
和 f64
.
正在使用 ASCII 编码的 "[=13=][=13=][=13=][=13=][=13=][=13=]\f0?"
初始化数据部分。这正是 s 表达式的作者选择使用的,在实际的二进制文件中它被编码为 4 或 8 个字节(f32
与 f64
)。我们也可以使用 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
。