странное поведение длинного типа данных - PullRequest
4 голосов
/ 25 января 2012

У меня проблема с типом данных Long при выполнении этой команды:

Long nanos = 3 * 1000000000
println nanos

Он печатает -1294967296, а не 3000000000, и я не знаю почему.
Я прочитал на этой странице, что Лонга достаточно. Так что не так?

Ответы [ 4 ]

10 голосов
/ 25 января 2012

Вы должны отметить свою вторую константу как long, иначе она считается целым числом, которое переполняется.Использование:

Long nanos = 3 * 1000000000L
4 голосов
/ 25 января 2012

Арифметика выполняется с помощью int, а затем сохраняется в Long. Попробуйте вместо этого:

Long nanos = 3L * 1000000000L
4 голосов
/ 25 января 2012

Вам нужно добавить суффикс к литералам, чтобы подразумевать, что они являются длинными значениями.В противном случае они интерпретируются как int.

  Long nanos = 3 * 1000000000L;

Подробнее об этом здесь .

1 голос
/ 25 января 2012

Вы можете легко проверить это с помощью groovy shell (groovysh):

groovy:000> 3.class                 
===> class java.lang.Integer

Литерал 3 представляет собой java.lang.Integer.

groovy:000> (3 * 1000000000).class
===> class java.lang.Integer

Произведение умножения такжеa java.lang.Integer

groovy:000> 3 * 1000000000        
===> -1294967296

Теперь легко видеть, что целое число преобразуется в Long после произошел оверлей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...