Em uma compilação nativa, o código a seguir imprime -1
. Compilado para WASM e executado em node.js, ele imprime 4294967295
. Por que os resultados são diferentes?
#include <iostream>
int main() {
unsigned F = 20;
long HB = 19; // both give -1 if this is `long long`
std::cout << HB-F << std::endl;
return 0;
}
Isso é feito g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
como compilador nativo e em++ 3.1.66 (1f519517284660f4b31ef9b7f921bf6ba66c4041)
para o emscripten compilar para WASM.
sizeof(unsigned) == sizeof(long)
no WASM como no Windows ABI, elong HB
(que tem o mesmo tamanho queint
) é promovido paraunsigned long
(que nesta plataforma tem o mesmo tamanho queunsigned int
).g++ por padrão traduz o código para um binário de 64 bits. Neste caso,
sizeof(unsigned) < sizeof(long)
andunsigned F
é promovido paralong int
.Tente invocar g++ com
-m32
para obter o resultado WASM.