Dart/Flutter 移位运算符返回不同的值

Dart/Flutter bitwise shift operator returning different values

与 mobile/desktop 相比,Dart/Flutter 中的移位运算符在 Web 中返回不同的值。

运行以下代码:

var checksum = 1150946793;
var shift = checksum << 5;
print(shift);

//Returns the following values
Mobile/Desktop = 36830297376
Web = 2470559008

我应该为网络做些什么?

Dart 将整数存储为带符号的 64 位值,使它们的可能范围为 −(2^63)2^63 − 1。当超过整数的最大值时,会发生回绕并丢失最高有效位。

然而,使用 JavaScript 位运算符 truncate their operands to 32-bit integers。这意味着您看到的回绕值 (4294967296) 比在台式机或移动设备上看到的要低得多。这就是您的数字计算方式不同的原因。

docs for int 有一个注释涵盖了这一点。

为了扩展 Stephen 的回答(解决了原因),一个解决方案是使用标准数学运算符,因为它们不会被截断为 32 位:

var checksum = 1150946793;
var shift = checksum * pow(2, 5).toInt();
print(shift);

我很确定这比使用按位运算要慢几个数量级,因此仅在绝对需要处理 64 位值的情况下才使用它可能是明智的(就像我使用 µs-precision 时间戳)。