webassembly文档指出,webassembly只能采用以下类型的
i32 | i64 | f32 | f64
一切都很好,但是,这里有一个非常简单的c++测试,它取4个整数并打印它们。
void intTest(
int32_t int32TypeArg,
uint32_t uint32TypeArg,
int64_t int64TypeArg,
uint64_t uint64TypeArg
){
std::cout << " int32_t :" << to_string(int32TypeArg) << std::endl;
std::cout << " uint32_t :" << to_string(uint32TypeArg) << std::endl;
std::cout << " int64_t :" << to_string(int64TypeArg) << std::endl;
std::cout << " uint64_t :" << to_string(uint64TypeArg) << std::endl;
}
当我在Firefox中编译并调用这个测试时,java脚本如下:
let js_int32_t = -1;
let js_uint32_t = 1;
let js_int64_t = -1596801628841;
let js_uint64_t = 1596801628841;
let val1 = parseInt(js_int32_t );
let val2 = parseInt(js_uint32_t );
let val3 = parseInt(js_int64_t );
let val4 = parseInt(js_uint64_t );
我得到以下输出:
Module._intTest( val1, val2, val3, val4);
int32_t :-1
uint32_t :1
int64_t :-3978021347401611945
uint64_t :0
为什么int64_t是3978021347401611945而不是"-1596801628841"?这是怎么回事?我明确地传递了一个类型";数字";形成javascrypt;parseInt";方法但更令人支持的是uint64_t是零而不是"0";1596801628841";。
更新1->08.2020年8月
我创建了一个非常简单的webassembly模块,它只有两种方法,即"main"one_answers"intTest">
整个代码可以在这里找到
https://github.com/courteous/wasmInt64Test
编译后的代码可以在这里找到
https://github.com/courteous/wasmInt64Test/tree/master/build/src
你可以从控制台运行它,比如:
emrun --no_browser firefox --verboise index.htm
然后在firefox控制台中:
Module._intTest( js_int32_t, js_uint32_t, js_int64_t, js_uint64_t);
如果您想自己编译代码,请运行
emcmake cmake -DCMAKE_BUILD_TYPE=WASM ../
更新2->08.2020年8月
使用std::bitset,我打印了购买的数字,即我得到的参数,即int64TypeArg
11001000 11001011 00111010 10101001 00110111 00110100 11000101 01010111
并将该数字静态设置为uint64_t变量1596801628841;
11111111 11111111 11111110 10001100 00110111 00110100 11000101 01010111
正如用户@harold所提到的,有几个比特匹配,即
101000110000110111001101001100010101010111
这些是匹配的42位。起初,我认为这可能与javaScript的最大整数有关,即53位,但这些是42而不是53。我真的很想弄清真相。
好吧,过了一段时间,你就可以了!!!不是!!!将i64从Java Script直接传递到WASM,而无需首先更改该变量的类型。如果我们想做到这一点,我们需要使用标志";WASM_ BIGINT";并将来自Java Script的长i64作为类型";BigInt";。示例:
var bigInt = BigInt(-1596801628841);
之后测试工作正常!这只适用于Firefox 79.0,但不适用于Chrome 84.0.4147.105很好的博客解释了这一切在这里和这里