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

flseospp  于 2022-12-20  发布在  其他
关注(0)|答案(1)|浏览(164)

整数除法运算符与强制转换正态除法的结果有什么不同吗?
考虑以下Dart代码:

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

这两个表达式编译成相同的机器码吗?我假设答案是:
答:是的,但这只是因为编译器足够聪明,可以重写第二个表达式。
B)是的,因为没有实际的区别而且第一个表达式是第二个的简写。
或者C)否,因为在CPU级别执行计算的方式不同,编译器不会为您优化。

hrirmatl

hrirmatl1#

x ~/ y不等效于(x / y).toInt()。整数运算(包括除法)明显快于浮点运算。
如果x ~/ y更快,那么编译器不能自动进行转换吗?也许可以,但这样的转换不会总是生成相同的结果,因此不一定合适。整数除法通常用于操作数为整数的情况。(也就是说,当你在整数域中开始,并想留在整数域中时)如果操作数是整数,则由于int(用于Dart VM的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更麻烦,尤其是当它是更复杂的算术表达式的一部分时。

相关问题