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.
总之,就是这样。
所以我 运行 在 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.
总之,就是这样。