在Dart中需要整数除法运算符吗?



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

考虑以下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(Dart虚拟机为64位符号整数)和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。

最新更新