WebAssembly では、すべての整数が LEB128 方式でエンコードされる。エンコードは符号あり/ なしでアルゴリズムが異なる。これを理解していないとデコードしたときに期待する値を得られない。
符号なし
624,485 は、以下のプロセスで 0xE5 0x8E 0x26 にエンコードされる。
10011000011101100101 010011000011101100101 7 の倍数 bit になるようパディングを追加 0100110 0001110 1100101 7 bit ごとに区切る 00100110 10001110 11100101 最上位のグループには 0, それ以外は 1 を高位 bit に追加 0x26 0x8E 0xE5 -> 0xE5 0x8E 0x26
リトルエンディアンなので、最下位のバイトから出力され最終的には 0xE5 0x8E 0x26 となる。
符号あり
-123456 は、以下のプロセスで 0xC0 0xBB 0x78 にエンコードされる。
111100001110111000000 1111000 0111011 1000000 01111000 10111011 11000000 0x78 0xBB 0xC0 -> 0xC0 0xBB 0x78
符号なしと同様かと思われるが、sign bit の取り扱いに気をつけなければならない。最上位のバイトの sign bit (0x40) が正負を表すようになっている。
64 は 0xC0 0x0 にエンコードされるが、0xC0 としてしまうと -64 との区別がつけられなくなってしまうため、最上位のバイトの sign bit が 1 にならないようにもう 1 byte 必要とする。
1000000 00000000 11000000 0x0 0xC0 -> 0xC0 0x0
-65 は 0xBF 0x7F にエンコードされる。
0111111 01111111 10111111 0x7F 0xBF -> 0xBF 0x7F