Dart 中整数除法运算符是必需的吗?

问题描述 投票:0回答:1

整数除法运算符与普通除法的结果有什么不同吗?

考虑以下 Dart 代码:

void main() {
  
  int a = 10;
  int b = 3;
  
  int result = a~/b;
  int result2 = (a/b).toInt();
  
}

这两个表达式都编译成相同的机器代码吗?我假设答案是:

A) 是的,但这只是因为编译器足够聪明,可以重写第二个表达式。

B) 是的,因为没有实际区别,第一个表达式是第二个表达式的简写。

或 C) 否,因为在 CPU 级别执行计算的方式有所不同,编译器不会为您优化它。

dart compilation integer-division
1个回答
4
投票

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.

© www.soinside.com 2019 - 2024. All rights reserved.