整数除法运算符与普通除法的结果有什么不同吗?
考虑以下 Dart 代码:
void main() {
int a = 10;
int b = 3;
int result = a~/b;
int result2 = (a/b).toInt();
}
这两个表达式都编译成相同的机器代码吗?我假设答案是:
A) 是的,但这只是因为编译器足够聪明,可以重写第二个表达式。
B) 是的,因为没有实际区别,第一个表达式是第二个表达式的简写。
或 C) 否,因为在 CPU 级别执行计算的方式有所不同,编译器不会为您优化它。
x ~/ y
不等同于 (x / y).toInt()
。整数运算(包括除法)应该1比浮点运算快得多。
如果
x ~/ y
更快,那么编译器不能自动进行转换吗?也许吧,但这样的转变并不总是产生相同的结果,所以它不一定是合适的。当操作数是整数时,通常使用整数除法。 (也就是说,当你在整数域中开始并希望停留在整数域中时。)如果操作数是整数,那么由于int
(64位有符号)之间的精度差异,这两个操作可能会产生不同的结果Dart VM 的整数)和 double
(一个 IEEE-754 双精度浮点数,其有效数具有 53 位精度):
void main() {
var x = 9223372036854775801; // Close to (but not exactly) 2^63 - 1
print(x); // Prints: 9223372036854775801
print(x ~/ 1); // Prints: 9223372036854775801
print((x / 1).toInt()); // Prints: 9223372036854775807
}
最后,
(x / y).toInt()
比 x ~/ y
更难写和读,特别是如果它是更复杂的算术表达式的一部分。
1 在实践中,事实证明没有太大的性能差异。见https://github.com/dart-lang/sdk/issues/46855.