Dart double "bitwise not" 给出了不同的结果 (~~-1 != -1)

Dart double "bitwise not" is giving different result (~~-1 != -1)

所以我 运行 在 DartPad 上飞镖并且我尝试了 运行 以下代码:

import 'dart:math';

void main() {
  print(~0);
  print(~-1);
  print(~~-1);
}

这导致了以下输出

4294967295
0
4294967295

如您所见,从 0 开始反转位得到最大数(我期待 -1,因为 dart 使用二进制补码)并且从 -1 开始反转得到 0,这造成反转 2 次 -1 的情况不给我-1.

看起来它在反转 0 时忽略了第一位,这是为什么?

为网络编译的 Dart(包括 DartPad)使用 JavaScript 数字和数字运算。 其后果之一是 按位 操作(~&|^<< , >>>>> on int) 只给出 32 位结果,因为那是相应的 JavaScript 操作所做的。

由于历史原因,Dart 选择给出 unsigned 32 位结果,而不是二进制补码。所以 ~-1 是 0 而 ~0 是无符号的 0xFFFFFFFF,而不是 -1.

总之,就是这样。