Überprüfen von Ganzzahlen gegen short
-Grenzen
Im vorherigen Schritt haben wir gesehen, wie man short
-Variablen innerhalb ihres gültigen Bereichs deklariert und verwendet. Jetzt wollen wir untersuchen, was passiert, wenn wir versuchen, einem short
-Variablen einen Wert zuzuweisen, der außerhalb des short
-Bereichs liegt.
Java verfügt über verschiedene Ganzzahl-Datentypen, darunter byte
, short
, int
und long
, wobei jeder einen anderen Bereich hat. Ein int
(Ganzzahl) ist ein 32-Bit vorzeichenbehafteter Zweierkomplement-Ganzzahltyp mit einem Bereich von -2.147.483.648 bis 2.147.483.647. Dieser Bereich ist viel größer als der von short
.
Wenn Sie versuchen, einen Wert von einem größeren Datentyp (wie int
) einem kleineren Datentyp (wie short
) zuzuweisen, muss Java explizit wissen, dass Sie sich der möglichen Informationsverlust bewusst sind. Dies wird Typumwandlung (type casting) genannt. Wenn Sie keine Typumwandlung durchführen, gibt Java Ihnen einen Kompilierungsfehler, um versehentlichen Datenverlust zu vermeiden.
Lassen Sie uns unser HelloJava.java
-Programm ändern, um dies zu demonstrieren.
-
Öffnen Sie die Datei HelloJava.java
im WebIDE-Editor.
-
Ersetzen Sie den vorhandenen Code durch den folgenden:
public class HelloJava {
public static void main(String[] args) {
int largeInt = 40000; // This value is outside the short range
// Attempt to assign largeInt to a short variable without casting
// short myShort = largeInt; // This line will cause a compilation error
// To assign a value from a larger type, we need to cast it
short myShort = (short) largeInt;
System.out.println("Value of largeInt cast to short: " + myShort);
int anotherLargeInt = -40000; // Another value outside the short range
short anotherShort = (short) anotherLargeInt;
System.out.println("Value of anotherLargeInt cast to short: " + anotherShort);
}
}
In diesem aktualisierten Code:
- Wir deklarieren eine
int
-Variable largeInt
mit dem Wert 40000, der größer ist als der maximale Wert, den ein short
aufnehmen kann (32767).
- Die auskommentierte Zeile
short myShort = largeInt;
zeigt, was passieren würde, wenn keine Typumwandlung durchgeführt würde – ein Kompilierungsfehler.
- Die Zeile
short myShort = (short) largeInt;
zeigt, wie man den int
-Wert in einen short
umwandelt. Das (short)
vor largeInt
ist der Typumwandlungsoperator.
- Wir tun dasselbe für einen negativen Wert
anotherLargeInt
(-40000), der kleiner ist als der minimale Wert, den ein short
aufnehmen kann (-32768).
-
Speichern Sie die Datei (Strg+S oder Cmd+S).
-
Jetzt kompilieren Sie das geänderte Programm im Terminal:
javac HelloJava.java
Diesmal sollte die Kompilierung erfolgreich sein, da wir die Typumwandlung verwendet haben.
-
Führen Sie das kompilierte Programm aus:
java HelloJava
Sie sollten eine Ausgabe ähnlich der folgenden sehen:
Value of largeInt cast to short: -25536
Value of anotherLargeInt cast to short: 25536
Beachten Sie, dass die Ausgabewerte (-25536 und 25536) nicht die ursprünglichen Werte (40000 und -40000) sind. Dies liegt daran, dass wenn Sie einen Wert, der außerhalb des Bereichs des Ziel-Datentyps liegt, umwandeln, der Wert "überläuft" (wraps around). Dies ist ein Beispiel für Überlauf (overflow) (für positive Werte, die den Maximalwert überschreiten) und Unterlauf (underflow) (für negative Werte, die den Minimalwert unterschreiten). Der genaue resultierende Wert hängt davon ab, wie die Zahlen in Binärform dargestellt werden. Dies zeigt, warum es wichtig ist, die Bereiche der Datentypen zu verstehen und die Typumwandlung vorsichtig zu verwenden, um unerwartete Ergebnisse zu vermeiden.