Webassembly i64基元类型



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很好的博客解释了这一切在这里和这里

相关内容

  • 没有找到相关文章

最新更新