【问题标题】:Avoiding Overflow避免溢出
【发布时间】:2014-01-27 16:04:05
【问题描述】:

此 Stackoverflow post 讨论了如果不将 L 附加到数字时可能出现的数字溢出问题:

这是来自 REPL 的示例:

scala> 100000 * 100000 // no type specified, so numbers are `int`'s
res0: Int = 1410065408

避免此问题的一种方法是使用L

scala> 100000L * 100000L
res1: Long = 10000000000

或者指定数字的类型:

scala> val x: Long = 100000
x: Long = 100000

scala> x * x
res2: Long = 10000000000

正确指定数字类型的最佳做法是什么?

【问题讨论】:

  • 这真是一个意见问题。对此没有普遍接受的最佳实践。我只使用L 后缀。
  • 这不是意见问题。添加 L 指定正确的类型,然后使用 ascription 转换它。
  • 鉴于 Daniel 的评论,为什么我的票被否决了?

标签: scala long-integer


【解决方案1】:

如果您使用的是 long,您应该始终使用 L。否则,您仍然会遇到问题:

scala> val x: Long = 10000000000
<console>:1: error: integer number too large
       val x: Long = 10000000000
                     ^

scala> val x = 10000000000L
x: Long = 10000000000

由于类型归属的转换发生在文字被解释为Int之后。

【讨论】:

  • 为什么100000 * 100000 不能存储在一个可以保存值而不溢出的数据结构中?这对编程语言编写者来说是不是一个沉重的负担?
  • @KevinMeredith 在某些语言中,确实如此。 Scala 遵循 Java 约定和类型,它是通过 C++ 继承自 C 的,并且默认为可以由 CPU 有效操作的数字类型——通常可以直接翻译成机器代码。
猜你喜欢
  • 1970-01-01
  • 2020-01-07
  • 2020-03-08
  • 1970-01-01
  • 2010-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多