2015-01-04 2 views
0

Я тестировала с этим фрагментом кода:Преобразование долго междунар дает 0

public class Test { 
    public static int longToInt(long num) { 
     return (int) (num); 
    } 

    public static void main(String[] args) { 
     System.out.println(longToInt(100000000L)); 
    } 
} 

Я побежал, но longToInt только вернулся 0. Что происходит?

+2

Невозможно воспроизвести: https://ideone.com/R4jZJ2 – Jack

+1

Вы получаете переполнение 'int', если ваше' long' значение больше, чем 'int' может обрабатывать. –

+0

Какая версия Java? Когда я запускаю свой код, я получаю '1215752192' –

ответ

1

отливка long к int осуществляется путем удаления верхнего 32 бита long. Если значение long больше Integer.MAX_VALUE (2147483647) или меньше Integer.MIN_VALUE (-2147483648), то чистый эффект заключается в том, что вы теряете значимые биты, а результат - «мусор».


Сказав, что код, который вы поставляется не ведет себя, как вы говорите, что делает ... если вы скомпилировать и запустить его правильно. Первоначальная версия должна печатать неожиданный номер ... но не ноль. Модифицированная версия должна печатать 1000000, как ожидалось.


... есть способ, которым я могу хранить длинные числа больше Integer.MAX_VALUE внутри Int числа?

No.

Ну строго да ... в некоторых обстоятельствах. Вы могли бы сделать что-то для отображения чисел, например, если вы знаете, что ваши номера всегда находятся в диапазоне A к B и B - A меньше 2 , то вы могли бы карту в этом диапазоне в long к int по вычитая из него A.

Однако математически невозможно определить такое отображение, если размер области чисел вы хранящие в long больше, чем 2 . Обычно это так.

+0

Я думаю, что это была другая ошибка ... Сказав это, есть ли способ, чтобы я мог хранить длинное число, большее, чем Integer.MAX_VALUE внутри int number? –

+0

Я бы не назвал число * неожиданным *. –

+0

@ChristianHujer - это неожиданно для OP. Тот, кому этот ответ в первую очередь адресован. (Я не сказал «непредсказуемый» или «случайный» ... оба из которых были бы действительно неправильными!) –

0

потому что, длинный вы дали не вписывается в int. Дайте меньше и попробуйте! INT (32 бит) длинных (64 бит)

+0

На самом деле '100000000L' * делает * вписывается в' int.' – EJP

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