2014-01-27 2 views
0

Это Stackoverflow post обсуждает потенциальную проблему числового переполнения, если не добавляя L к ряду:избежать переполнения

Вот пример из РЕПЛ:

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' указывает правильный тип, используя ascription, преобразует его впоследствии. –

+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++ и по умолчанию используются числовые типы, которые могут быть эффективно обработаны процессором - с прямыми переводами в машинный код, достаточно часто. –

Смежные вопросы