gpt4 book ai didi

dart - Dart2Js 中按位运算,结果错误

转载 作者:行者123 更新时间:2023-12-03 03:59:49 29 4
gpt4 key购买 nike

我在做ZigZag使用 Dart 对 32 位整数进行编码。这是我正在使用的源代码:

int _encodeZigZag(int instance) => (instance << 1) ^ (instance >> 31);
int _decodeZigZag(int instance) => (instance >> 1) ^ (-(instance & 1));

代码在 DartVM 中按预期工作。

但是在 dart2js 中,如果我输入负数,_decodeZigZag 函数将返回无效结果。例如-10-10 被编码为 19,应该解码回 -10,但它被解码为 4294967286。如果我在 Chrome 的 JavaScript 控制台中运行 (instance >> 1) ^ (-(instance & 1)) ,我会得到 -10 的预期结果。这对我来说意味着 Javascript 应该能够使用它的数字模型正确运行此操作。

但是 Dart2Js 生成以下 JavaScript,它看起来与我在控制台中测试的代码不同:

return ($.JSNumber_methods.$shr(instance, 1) ^ -(instance & 1)) >>> 0;

为什么 Dart2Js 在函数中添加了使用过的右移 0 ?如果没有转变,结果将如预期。

现在我想知道,这是 Dart2Js 编译器中的错误还是预期的结果?有没有办法强制 Dart2Js 输出正确的 javascript 代码?

或者我的 Dart 代码错误?

PS:还测试了将 XOR 拆分为其他运算,但 Dart2Js 仍在添加右移:

final a = -(instance & 1);
final b = (instance >> 1);

return (a & -b) | (-a & b);

结果:

a = -(instance & 1);
b = $.JSNumber_methods.$shr(instance, 1);
return (a & -b | -a & b) >>> 0;

最佳答案

出于效率原因,dart2js 将 Dart 数字编译为 JS 数字。然而,JS 只提供一种数字类型: double 。此外,JS 中的位操作总是被截断为 32 位。

在许多情况下(例如密码学),处理无符号 32 位更容易,因此 dart2js 编译位运算,使其结果是无符号 32 位数字。

这两种选择(签名或未签名)都不是完美的。最初 dart2js 编译为带符号的 32 位,只有当我们过于频繁地绊倒它时才进行更改。正如您的代码所示,这并不能消除问题,只是将其转移到不同的(希望频率较低的)用例。

不合规的数字语义一直是 dart2js 中长期存在的错误,但修复它需要时间,并且可能会减慢生成的代码的速度。在短期内,Dart 开发人员(编译为 JS)需要了解此限制并解决它。

关于dart - Dart2Js 中按位运算,结果错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17427976/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com