Beachten Sie jedoch, dass große Zahlen (normalerweise größer als 2147483647und kleiner als -2147483648) einige der Bits verlieren und falsch dargestellt werden.
Zum Beispiel 2147483648würde dargestellt als -2147483648.
@khachik ich denke , die Genauigkeit ist 1. Oder vielleicht 42 natürlich :)
extraneon
7
Casting hat unterschiedliche Bedeutungen für Objekte und für primitive Typen. (int) Ich versuche nicht, eine 64-Bit-Ganzzahl als 32-Bit-Ganzzahl zu behandeln, sondern gebe tatsächlich eine andere 32-Bit-Ganzzahl mit denselben 32 Bits niedrigerer Ordnung zurück. Bei Objekten wandeln Sie in eine spezifischere untergeordnete Klasse um, bei primitiven Typen ist eine Besetzung jedoch nicht wirklich eine Besetzung, sondern eine Konvertierung.
Dspyz
Int x = (int) (((Long) Integer.MAX_INTEGER) +10); Wenn eine Konvertierung in diesem Fall nicht erkennt, dass x einen falschen Wert hat, haben Sie keine Lösung.
Rosercostin
Math.toIntExact () ist eine großartige Methode. Es wird eine Ausnahme ausgelöst, wenn der Wert zu groß ist, um in ein int zu passen. Danke für den Vorschlag.
Was ist der Unterschied zwischen dieser Art und dem einfachen Casting des Werts? Ich denke, dass alles, was intValue()hier im Hintergrund geschieht, den Wert wirft. Richtig?
Tim Wißmann
1
Beachten Sie die Typen. Es ist hier kein Primitiv long. Es ist der Referenztyp, Longder nicht direkt in ein Primitiv umgewandelt werden kann int. int y = (int)x;wird eine Ausführung auslösen, int y = (int)(long)xwird aber funktionieren. (Der Grund ist Autoboxing)
Akop
58
Für kleine Werte reicht das Gießen aus:
long l =42;int i =(int) l;
A longkann jedoch mehr Informationen enthalten als a int, so dass es im allgemeinen Fall nicht möglich ist, perfekt von longzu konvertieren int. Wenn der longWert eine Zahl kleiner oder gleich enthält, können Integer.MAX_VALUESie ihn durch Casting konvertieren, ohne Informationen zu verlieren.
Zum Beispiel der folgende Beispielcode:
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);
erzeugt die folgende Ausgabe auf meinem Computer:
largest long is 9223372036854775807
largest int is 2147483647long x=2147483648int y=-2147483648
Beachten Sie das negative Vorzeichen y. Da xein Wert größer als Integer.MAX_VALUE war, int ykonnte er nicht gehalten werden. In diesem Fall wurde es um die negativen Zahlen gewickelt.
Wenn Sie diesen Fall selbst behandeln möchten, können Sie Folgendes tun:
if( x >(long)Integer.MAX_VALUE ){// x is too big to convert, throw an exception or something useful}else{
y =(int)x;}
All dies setzt positive Zahlen voraus. Verwenden Sie für negative Zahlen MIN_VALUEanstelle von "MAX_VALUE"
Eine ordnungsgemäße Konvertierung besteht also darin, festzustellen, ob die Konvertierung sicher ist, und ansonsten eine Ausnahme auszulösen. Fakt von @Andrej Herich, der die Guavenbibliothek vorschlug.
Rosercostin
55
Seit Java 8 können Sie Folgendes verwenden: Math.toIntExact (langer Wert)
Es ist nicht erforderlich, Bibliotheken zu verwenden
Grekz
6
@Grekz das liegt am OP. Ich würde in diesem Fall. Mehr Abhängigkeitsgläser sind besser als neu erfundene Räder, es sei denn, Sie haben einen tatsächlichen Grund, nicht mehr Abhängigkeitsgläser zu haben.
Djechlin
1
IMHO, diese Antwort ist viel besser als die akzeptierte, da sie niemals etwas Unerwartetes bewirkt.
Mark Slater
5
Da mein Projekt dieses Glas bereits enthält, wäre es
vorteilhafter
24
long x =3;int y =(int) x;
aber das setzt voraus, dass das longals dargestellt intwerden kann, kennen sie den unterschied zwischen den beiden?
Interessant zu wissen ist, dass gemäß Par 5.1.3 in java.sun.com/docs/books/jls/third_edition/html/… (Die Java-Sprachspezifikation): Trotz der Tatsache, dass Überlauf, Unterlauf oder anderer Informationsverlust auftreten können Wenn Konvertierungen zwischen primitiven Typen eingegrenzt werden, führt dies niemals zu einer Laufzeitausnahme (§11).
extraneon
18
Sie können den LongWrapper anstelle von longprimitiv und call verwenden
Es kann eine gute Idee sein, auf die aktuelle Dokumentation zu verlinken und diese zu erweitern - bei der Konvertierung eines Longs in einen Int wird es zwangsläufig zu einer gewissen Rundung kommen.
Makoto
2
Wenn man sich die Java 7-Implementierung von Long.intValue () ansieht, ist es nur Casting. Es ist keine Unter- / Überlaufprüfung implementiert. Zumindest über Java 7 entspricht diese Option nur: (int) someLong.
Buzz3791
warum weniger positive Stimmen? Ich fand diese eine der wertvollsten Antworten
Anand j. Kadhi
3
Wenn das direkte Casting einen Fehler anzeigt, können Sie dies folgendermaßen tun:
In Java ist ein Long eine vorzeichenbehaftete 64-Bit-Zahl, dh Sie können Zahlen zwischen -9.223.372.036.854.775.808 und 9.223.372.036.854.775.807 (einschließlich) speichern.
Ein int ist dagegen mit einer 32-Bit-Nummer signiert, was bedeutet, dass Sie eine Nummer zwischen -2.147.483.648 und 2.147.483.647 (einschließlich) speichern können.
Wenn Ihr Long also außerhalb der für ein Int zulässigen Werte liegt, erhalten Sie keine wertvolle Konvertierung.
Details zur Größe primitiver Java-Typen finden Sie hier:
Die Frage wurde bereits beantwortet, als ich sie sah, aber das Thema der Grenzen der Konvertierung wurde nicht erklärt. Was ich damals getan habe. Wenn Sie denken, dass das "bla bla bla" ist, bedeutet das nur, dass Sie eine Art Genie sind, das auf so etwas verzichten kann, aber für uns bloße Menschen kann eine Erklärung nützlich sein. Vielen Dank für Ihre "Eingabe" ...
Alexis Dufrenoy
1
In Java 8 mache ich folgendes
long l =100L;int i =Math.toIntExact(l);
Diese Methode löst aus, ArithmaticExceptionwenn der longWert den Bereich von überschreitet int. Somit bin ich vor Datenverlust sicher.
Im Frühjahr gibt es eine strenge Möglichkeit, ein Long in Int umzuwandeln
Nicht nur lnog kann in int konvertieren, jeder Klassentyp erweitert Number kann generell in einen anderen Number-Typ konvertiert werden. Hier zeige ich Ihnen, wie Sie einen Long in int konvertieren, einen anderen Typ umgekehrt.
Long l =1234567L;int i = org.springframework.util.NumberUtils.convertNumberToTargetClass(l,Integer.class);
Antworten:
Aktualisiert in Java 8:
Ursprüngliche Antwort:
Einfaches Typgießen sollte es tun:
Beachten Sie jedoch, dass große Zahlen (normalerweise größer als
2147483647
und kleiner als-2147483648
) einige der Bits verlieren und falsch dargestellt werden.Zum Beispiel
2147483648
würde dargestellt als-2147483648
.quelle
quelle
intValue()
hier im Hintergrund geschieht, den Wert wirft. Richtig?long
. Es ist der Referenztyp,Long
der nicht direkt in ein Primitiv umgewandelt werden kannint
.int y = (int)x;
wird eine Ausführung auslösen,int y = (int)(long)x
wird aber funktionieren. (Der Grund ist Autoboxing)Für kleine Werte reicht das Gießen aus:
A
long
kann jedoch mehr Informationen enthalten als aint
, so dass es im allgemeinen Fall nicht möglich ist, perfekt vonlong
zu konvertierenint
. Wenn derlong
Wert eine Zahl kleiner oder gleich enthält, könnenInteger.MAX_VALUE
Sie ihn durch Casting konvertieren, ohne Informationen zu verlieren.Zum Beispiel der folgende Beispielcode:
erzeugt die folgende Ausgabe auf meinem Computer:
Beachten Sie das negative Vorzeichen
y
. Dax
ein Wert größer als Integer.MAX_VALUE war,int y
konnte er nicht gehalten werden. In diesem Fall wurde es um die negativen Zahlen gewickelt.Wenn Sie diesen Fall selbst behandeln möchten, können Sie Folgendes tun:
All dies setzt positive Zahlen voraus. Verwenden Sie für negative Zahlen
MIN_VALUE
anstelle von "MAX_VALUE"quelle
Seit Java 8 können Sie Folgendes verwenden: Math.toIntExact (langer Wert)
Siehe JavaDoc: Math.toIntExact
Quellcode von
Math.toIntExact
in JDK 8:quelle
Wenn Sie die Guava-Bibliothek verwenden , gibt es Methoden
Ints.checkedCast(long)
undInts.saturatedCast(long)
zum Konvertierenlong
inint
.quelle
aber das setzt voraus, dass das
long
als dargestelltint
werden kann, kennen sie den unterschied zwischen den beiden?quelle
Sie können den
Long
Wrapper anstelle vonlong
primitiv und call verwendenJava7 intValue () -Dokumente
Der
long
Wert wird entsprechend gerundet / abgeschnitten , um in eine zu passenint
.quelle
Wenn das direkte Casting einen Fehler anzeigt, können Sie dies folgendermaßen tun:
quelle
In Java ist ein Long eine vorzeichenbehaftete 64-Bit-Zahl, dh Sie können Zahlen zwischen -9.223.372.036.854.775.808 und 9.223.372.036.854.775.807 (einschließlich) speichern.
Ein int ist dagegen mit einer 32-Bit-Nummer signiert, was bedeutet, dass Sie eine Nummer zwischen -2.147.483.648 und 2.147.483.647 (einschließlich) speichern können.
Wenn Ihr Long also außerhalb der für ein Int zulässigen Werte liegt, erhalten Sie keine wertvolle Konvertierung.
Details zur Größe primitiver Java-Typen finden Sie hier:
http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
quelle
In Java 8 mache ich folgendes
Diese Methode löst aus,
ArithmaticException
wenn derlong
Wert den Bereich von überschreitetint
. Somit bin ich vor Datenverlust sicher.quelle
Wenn Sie eine sichere Konvertierung durchführen und die Verwendung von Java8 mit Lambda-Ausdruck genießen möchten, können Sie es wie folgt verwenden:
quelle
Function<Long,Integer> function =
?lang x = 3120L; // nimm einen beliebigen langen Wert int z = x.intValue (); // Sie können double auch auf die gleiche Weise in int konvertieren
wenn Sie dann direkt verdecken müssen
longvalue.intvalue ();
quelle
quelle
Im Frühjahr gibt es eine strenge Möglichkeit, ein Long in Int umzuwandeln
Nicht nur lnog kann in int konvertieren, jeder Klassentyp erweitert Number kann generell in einen anderen Number-Typ konvertiert werden. Hier zeige ich Ihnen, wie Sie einen Long in int konvertieren, einen anderen Typ umgekehrt.
quelle