2014-01-27 68 views
0

此#1 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 

怎样才算正确指定数量的类型的最佳实践?

+1

这实在是一个意见问题。对此没有普遍接受的最佳做法。我只是使用'L'后缀。 – Jesper

+2

这不是一个意见问题。添加一个'L'指定正确的类型,然后使用归属进行转换。 –

+1

根据丹尼尔的评论,为什么我得到了低票? –

回答

6

您应该总是使用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发生。

+0

为什么'100000 * 100000'没有存储在一个数据结构中,该数据结构可以保存值*而不溢出?这是编程语言编写者的高负担吗? –

+1

@KevinMeredith在某些语言中,它的确如此。 Scala遵循Java约定和类型,这些约定和类型是通过C++从C继承的,并且默认为可以由CPU有效操纵的数字类型 - 通常足够直接翻译成机器代码。 –