WebAssembly中带负值的无符号运算原理是什么?
WebAssembly i32.div_u 等无符号运算的负数处理逻辑
带_u后缀的WebAssembly整数运算(比如i32.div_u),核心逻辑是将所有操作数当作无符号32位整数处理——不管你用i32.const传入的是正数还是负数,都会直接取它的32位二进制补码,按无符号整数的规则解析成对应的数值,再执行运算。
逐个拆解你遇到的例子:
第一个例子:2 和 -3 做无符号除法
i32.const 2的32位二进制是00000000 00000000 00000000 00000010,对应的无符号值就是2。i32.const -3的32位补码是11111111 11111111 11111111 11111101,转成无符号整数是4294967293(即2^32 -3)。- 无符号除法
2 ÷ 4294967293的商是0,所以运算结果为0。
第二个例子:-2 和 3 做无符号除法
i32.const -2的32位补码是11111111 11111111 11111111 11111110,对应无符号值4294967294(2^32 -2)。i32.const 3的无符号值就是3。- 计算
4294967294 ÷ 3,商为1431655764(3×1431655764=4294967292,余数为2),和你得到的结果一致。
两个负数的无符号除法情况
负数的补码转无符号值后,本质是接近2^32的大整数:
-5的32位补码对应无符号值4294967291(2^32 -5)-4的32位补码对应无符号值4294967292(2^32 -4)- 当用-5除以-4时,相当于
4294967291 ÷ 4294967292,被除数小于除数,商为0; - 当用-4除以-5时,相当于
4294967292 ÷ 4294967291,被除数比除数大1,商为1。
- 当用-5除以-4时,相当于
所有带_u后缀的WebAssembly整数运算(比如i32.add_u、i32.mul_u等)都遵循这个规则:完全基于操作数的二进制补码做无符号解析,不考虑原数值的正负属性。
内容的提问来源于stack exchange,提问作者Tyler
相关产品推荐
相关产品推荐

