整数除法运算符与普通除法的结果有什么不同吗?
考虑以下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。