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

问题描述

与移动设备/台式机相比,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的注释对此进行了说明。

,

要扩展斯蒂芬的答案(解决问题的原因),一种解决方案是使用标准数学运算符,因为这些运算符不会被截断为32位:

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

我敢肯定,这比使用按位运算要慢几个数量级,因此仅在绝对需要处理64位值的情况下才使用它可能是明智的选择(例如,以我的µs精度时间戳为例)。 / p>