Обратите внимание, однако, что большие числа (обычно больше 2147483647и меньше чем -2147483648) будут терять некоторые биты и будут представлены неправильно.
Например, 2147483648будет представлен как -2147483648.
@khachik Я думаю, что точность равна 1. Или, может быть, 42, конечно :)
extraneon
7
Кастинг имеет разные значения для объектов и для примитивных типов. (int) Я не пытаюсь обработать 64-разрядное целое число как 32-разрядное целое, оно фактически возвращает другое 32-разрядное целое число с теми же 32-мя младшими битами. С объектами вы приводите к более конкретному дочернему классу, но с примитивными типами приведение - это не преобразование, а преобразование.
dspyz
Int x = (int) (((Long) Integer.MAX_INTEGER) +10); Если преобразование не обнаружит в этом случае, что x имеет неправильное значение, то у вас нет решения.
raisercostin
Math.toIntExact () на самом деле отличный метод. Выдает исключение, если значение слишком велико, чтобы поместиться в int. Спасибо за предложение.
В чем разница между этим способом и простым приведением значения? Я думаю, что все, что intValue()здесь, на заднем плане - это приведение значения.
Тим Виссманн
1
Обратите внимание на типы. Это не примитив longздесь. Это ссылочный тип, Longкоторый не может быть напрямую приведен к примитиву int. int y = (int)x;будет бросать, но int y = (int)(long)xбудет работать. (Причина в автобоксе)
акоп
58
Для небольших значений достаточно литья:
long l =42;int i =(int) l;
Тем не менее, longможет содержать больше информации , чем int, так что это не возможно , чтобы полностью конвертировать longв int, в общем случае. Если число longсодержит число, меньшее или равное Integer.MAX_VALUEвам, вы можете преобразовать его, разыгрывая без потери какой-либо информации.
Например, следующий пример кода:
System.out.println("largest long is "+Long.MAX_VALUE );System.out.println("largest int is "+Integer.MAX_VALUE );long x =(long)Integer.MAX_VALUE;
x++;System.out.println("long x="+ x);int y =(int) x;System.out.println("int y="+ y);
производит следующий вывод на моей машине:
largest long is 9223372036854775807
largest int is 2147483647long x=2147483648int y=-2147483648
Обратите внимание на отрицательный знак y. Потому что xсодержал значение, большее чем Integer.MAX_VALUE, int yне смог его удержать. В этом случае это обернулось к отрицательным числам.
Если вы хотите разобраться с этим делом самостоятельно, вы можете сделать что-то вроде:
if( x >(long)Integer.MAX_VALUE ){// x is too big to convert, throw an exception or something useful}else{
y =(int)x;}
Все это предполагает положительные числа. Для отрицательных чисел используйте MIN_VALUEвместо `MAX_VALUE '
Поэтому правильное преобразование будет состоять в том, чтобы определить, является ли преобразование безопасным, и в противном случае выдать исключение. Факт, изложенный @Andrej Herich, который предложил библиотеку Guava.
raisercostin
55
Начиная с Java 8 вы можете использовать: Math.toIntExact (длинное значение)
@Grekz, это до ОП. Я бы в этом случае. Больше банок зависимостей лучше, чем больше изобретенных колес, если у вас нет реальной причины не иметь больше банок зависимостей.
Джечлин
1
ИМХО, этот ответ намного лучше принятого в том, что он никогда не делает ничего неожиданного.
Марк Слейтер
5
Поскольку мой проект уже содержит этот jar-файл, было бы лучше использовать его, чем написать новый помощник
Osify
24
long x =3;int y =(int) x;
но это предполагает, что longможно представить как int, вы знаете разницу между ними?
Интересно знать, что в соответствии с п. 5.1.3 в java.sun.com/docs/books/jls/third_edition/html/… (спецификации языка Java): несмотря на тот факт, что переполнение, недополнение или другая потеря информации могут происходят, сужение преобразований среди примитивных типов никогда не приводит к исключению времени выполнения (§11).
Extraneon
19
Вы можете использовать Longоболочку вместо longпримитива и вызова
Это может быть хорошей идеей, чтобы ссылаться на текущую документацию, а также расширять ее - неизбежно будет некоторая степень округления при преобразовании long в int.
Макото
2
Глядя на реализацию Long 7.intValue () в Java 7, это просто приведение. Не выполняется проверка недопустимости / переполнения. Так что, по крайней мере, в Java 7, эта опция эквивалентна просто: (int) someLong.
buzz3791
почему меньше голосов? Я нашел этот самый ценный ответ
Ананд Дж. Кадхи
3
Если прямое приведение показывает ошибку, вы можете сделать это так:
В Java long - это 64-разрядное число со знаком, что означает, что вы можете хранить числа от -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807 (включительно).
Int, с другой стороны, имеет 32-разрядное число со знаком, что означает, что вы можете хранить число от -2 147 483 648 до 2 147 483 647 (включительно).
Поэтому, если ваш long находится за пределами значений, разрешенных для int, вы не получите полноценного преобразования.
Подробности о размерах примитивных типов Java здесь:
На вопрос я уже ответил, когда увидел его, но предмет ограничений не был объяснен. Что я и сделал тогда. Если вы думаете, что это «бла бла бла», это означает, что вы просто гений, который может обходиться без подобных вещей, но для нас, простых людей, объяснение может быть полезным. Спасибо за ваш "вклад" ...
Алексис Дафреной
1
В Java 8 я делаю следующим образом
long l =100L;int i =Math.toIntExact(l);
Этот метод выдает, ArithmaticExceptionесли longзначение превышает диапазон int. Таким образом, я в безопасности от потери данных.
Если вы хотите сделать безопасное преобразование и наслаждаться использованием Java8 с лямбда-выражением, вы можете использовать его следующим образом:
val ->Optional.ofNullable(val).map(Long::intValue).orElse(null)
Весной есть строгий способ конвертировать long в int
не только lnog может конвертировать в int, любой тип расширяет класс Number может конвертировать в другой тип Number в общем, здесь я покажу вам, как конвертировать long в int, другой тип наоборот.
Long l =1234567L;int i = org.springframework.util.NumberUtils.convertNumberToTargetClass(l,Integer.class);
Ответы:
Обновлено в Java 8:
Оригинальный ответ:
Простое приведение типов должно сделать это:
Обратите внимание, однако, что большие числа (обычно больше
2147483647
и меньше чем-2147483648
) будут терять некоторые биты и будут представлены неправильно.Например,
2147483648
будет представлен как-2147483648
.источник
источник
intValue()
здесь, на заднем плане - это приведение значения.long
здесь. Это ссылочный тип,Long
который не может быть напрямую приведен к примитивуint
.int y = (int)x;
будет бросать, ноint y = (int)(long)x
будет работать. (Причина в автобоксе)Для небольших значений достаточно литья:
Тем не менее,
long
может содержать больше информации , чемint
, так что это не возможно , чтобы полностью конвертироватьlong
вint
, в общем случае. Если числоlong
содержит число, меньшее или равноеInteger.MAX_VALUE
вам, вы можете преобразовать его, разыгрывая без потери какой-либо информации.Например, следующий пример кода:
производит следующий вывод на моей машине:
Обратите внимание на отрицательный знак
y
. Потому чтоx
содержал значение, большее чем Integer.MAX_VALUE,int y
не смог его удержать. В этом случае это обернулось к отрицательным числам.Если вы хотите разобраться с этим делом самостоятельно, вы можете сделать что-то вроде:
Все это предполагает положительные числа. Для отрицательных чисел используйте
MIN_VALUE
вместо `MAX_VALUE 'источник
Начиная с Java 8 вы можете использовать: Math.toIntExact (длинное значение)
См. JavaDoc: Math.toIntExact
Исходный код
Math.toIntExact
в JDK 8:источник
Если вы используете библиотеку Guava , есть методы
Ints.checkedCast(long)
иInts.saturatedCast(long)
для преобразованияlong
вint
.источник
но это предполагает, что
long
можно представить какint
, вы знаете разницу между ними?источник
Вы можете использовать
Long
оболочку вместоlong
примитива и вызоваJava7 intValue () документы
Это округляет / усекает
long
значение соответственно, чтобы соответствовать вint
.источник
Если прямое приведение показывает ошибку, вы можете сделать это так:
источник
В Java long - это 64-разрядное число со знаком, что означает, что вы можете хранить числа от -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807 (включительно).
Int, с другой стороны, имеет 32-разрядное число со знаком, что означает, что вы можете хранить число от -2 147 483 648 до 2 147 483 647 (включительно).
Поэтому, если ваш long находится за пределами значений, разрешенных для int, вы не получите полноценного преобразования.
Подробности о размерах примитивных типов Java здесь:
http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
источник
В Java 8 я делаю следующим образом
Этот метод выдает,
ArithmaticException
еслиlong
значение превышает диапазонint
. Таким образом, я в безопасности от потери данных.источник
Если вы хотите сделать безопасное преобразование и наслаждаться использованием Java8 с лямбда-выражением, вы можете использовать его следующим образом:
источник
Function<Long,Integer> function =
?длинный х = 3120 л; // принять любое длинное значение int z = x.intValue (); // вы также можете конвертировать double в int таким же образом
если вам нужно скрыть напрямую, то
longvalue.intvalue ();
источник
источник
Весной есть строгий способ конвертировать long в int
не только lnog может конвертировать в int, любой тип расширяет класс Number может конвертировать в другой тип Number в общем, здесь я покажу вам, как конвертировать long в int, другой тип наоборот.
источник