JavaRush /Java-Blog /Random-DE /Umwandeln (Konvertieren) primitiver Typen in Java

Umwandeln (Konvertieren) primitiver Typen in Java

Veröffentlicht in der Gruppe Random-DE
Hallo! Bei der Durchsicht von JavaRush sind Sie mehr als einmal auf primitive Typen gestoßen. Hier ist eine kurze Liste dessen, was wir über sie wissen:
  1. Sie sind keine Objekte und stellen einen im Speicher gespeicherten Wert dar
  2. Es gibt verschiedene Arten primitiver Typen:
    • Ganze Zahlen - byte, short, int,long
    • Gleitkommazahlen (Bruchzahl) - floatunddouble
    • Boolescher Wert -boolean
    • Symbolisch (zur Angabe von Buchstaben und Zahlen) –char
  3. Jeder von ihnen hat seinen eigenen Wertebereich:
Primitiver Typ Größe im Speicher Wertebereich
Byte 8 Bit -128 bis 127
kurz 16 Bit bis -32768 bis 32767
verkohlen 16 Bit von 0 bis 65536
int 32 Bit von -2147483648 bis 2147483647
lang 64 Bit von -9223372036854775808 bis 9223372036854775807
schweben 32 Bit von (2 hoch -149) bis ((2-2 hoch -23)*2 hoch 127)
doppelt 64 Bit von (-2 hoch 63) bis ((2 hoch 63) - 1)
Boolescher Wert 8 (bei Verwendung in Arrays), 32 (bei Verwendung in Nicht-Arrays) richtig oder falsch
Neben den Werten unterscheiden sich die Typen aber auch in der Speichergröße. intdauert mehr als byte. A long– mehr als short. Der von Primitiven belegte Speicher kann mit Nistpuppen verglichen werden: Expansion und Kontraktion primitiver Typen - 2 Im Inneren der Nistpuppe ist freier Speicherplatz vorhanden. Je größer die Nistpuppe, desto mehr Platz. longWir können problemlos eine kleinere Puppe in eine große Nistpuppe stecken int. Es passt problemlos und Sie müssen nichts weiter tun. In Java wird dies bei der Arbeit mit Grundelementen als automatische Konvertierung bezeichnet. Auf andere Weise wird es eine Erweiterung genannt. Hier ist ein einfaches Erweiterungsbeispiel:
public class Main {

   public static void main(String[] args) {

       int bigNumber = 10000000;

       byte littleNumber = 16;

       bigNumber = littleNumber;
       System.out.println(bigNumber);
   }
}
Hier weisen wir byteeiner Variablen einen Wert zu int. Die Zuweisung war erfolgreich und ohne Probleme: Der in gespeicherte Wert belegt byteweniger Speicherplatz, als er hinein „passt“ int. „Kleine Matroschka“ (Wert byte) passt problemlos in die „große Matroschka“ (Variable int). Eine andere Sache ist es, wenn Sie das Gegenteil versuchen – einen großen Wert in eine Variable eingeben, die nicht für solche Größen ausgelegt ist. Im Prinzip funktioniert dieser Trick nicht mit echten Nistpuppen, aber in Java funktioniert er, allerdings mit Nuancen. intVersuchen wir, einen Wert in eine Variable einzufügen short:
public static void main(String[] args) {

   int bigNumber = 10000000;

   short littleNumber = 1000;

   littleNumber = bigNumber;//Fehler!
   System.out.println(bigNumber);
}
Fehler! Der Compiler versteht, dass Sie versuchen, etwas Ungewöhnliches zu tun, und steckt eine große Matroschka-Puppe ( int) in eine kleine ( short). Ein Kompilierungsfehler ist in diesem Fall eine Warnung des Compilers: „ Hey, sind Sie sicher, dass Sie das tun möchten?“ „Wenn Sie sicher sind, teilen Sie es dem Compiler mit: „ Alles ist in Ordnung, ich weiß, was ich tue!“ „Dieser Vorgang wird explizite Typkonvertierung oder Eingrenzung genannt . Um eine Einschränkung vorzunehmen, müssen Sie explizit den Typ angeben, in den Sie Ihren Wert umwandeln möchten. Beantworten Sie mit anderen Worten die Frage des Compilers: „ Nun, in welche dieser kleinen Puppen möchten Sie diese große Puppe stecken?“ „In unserem Fall wird es so aussehen:
public static void main(String[] args) {

   int bigNumber = 10000000;

   short littleNumber = 1000;

   littleNumber = (short) bigNumber;
   System.out.println(littleNumber);
}
intWir haben ausdrücklich darauf hingewiesen, dass wir den Wert in eine Variable einpassen shortund die Verantwortung dafür übernehmen wollen. Wenn der Compiler einen expliziten Hinweis auf einen engeren Typ erkennt, führt er eine Konvertierung durch. Was wird das Ergebnis sein? Konsolenausgabe: -27008 Etwas unerwartet. Warum genau so? Es ist eigentlich einfach. Wir hatten den ursprünglichen Wert – 10000000. Er wurde in einer Variablen gespeichert int, die 32 Bits belegte, und in binärer Form sah er so aus: Expansion und Kontraktion primitiver Typen - 3 Wir schreiben diesen Wert in die Variable short, aber sie kann nur 16 Bits speichern! Dementsprechend werden nur die ersten 16 Bits unserer Zahl dorthin verschoben, der Rest wird verworfen. Infolgedessen shortenthält die Variable den Wert Expansion und Kontraktion primitiver Typen - 4, der in Dezimalform genau -27008 entspricht. Aus diesem Grund hat der Compiler „um Bestätigung gebeten“ in Form einer expliziten Umwandlung in einen bestimmten Typ. Erstens zeigt es, dass Sie die Verantwortung für das Ergebnis übernehmen, und zweitens teilt es dem Compiler mit, wie viel Speicherplatz er bei der Typumwandlung zuweisen muss. Denn wenn wir im letzten Beispiel intin den Typ umgewandelt hätten byteund nicht in short, hätten wir nur 8 Bits zur Verfügung, nicht 16, und das Ergebnis wäre anders ausgefallen. Bei Bruchtypen ( floatund double) erfolgt die Verengung unterschiedlich. Wenn Sie versuchen, eine solche Zahl in einen Ganzzahltyp umzuwandeln, wird ihr Bruchteil verworfen.
public static void main(String[] args) {

   double d = 2.7;

   long x = (int) d;
   System.out.println(x);
}
Konsolenausgabe: 2

Datentyp char

Sie wissen bereits, dass der Typ char zur Anzeige einzelner Zeichen verwendet wird.
public static void main(String[] args) {

   char c = '!';
   char z = 'z';
   char i = '8';

}
Es verfügt jedoch über eine Reihe von Funktionen, die es zu verstehen gilt. Schauen wir uns noch einmal die Tabelle mit Wertebereichen an:
Primitiver Typ Größe im Speicher Wertebereich
Byte 8 Bit -128 bis 127
kurz 16 Bit -32768 bis 32767
verkohlen 16 Bit von 0 bis 65536
int 32 Bit von -2147483648 bis 2147483647
lang 64 Bit von -9223372036854775808 bis 9223372036854775807
schweben 32 Bit von (2 hoch -149) bis ((2-2 hoch -23)*2 hoch 127)
doppelt 64 Bit von (-2 hoch 63) bis ((2 hoch 63)-1)
Boolescher Wert 8 (bei Verwendung in Arrays), 32 (bei Verwendung in Nicht-Arrays) richtig oder falsch
Der Typ charhat einen Zahlenbereich von 0 bis 65536. Aber was bedeutet das? Schließlich charhandelt es sich dabei nicht nur um Zahlen, sondern auch um Buchstaben, Satzzeichen... Tatsache ist, dass Werte charin Java im Unicode-Format gespeichert werden. Wir sind Unicode bereits in einer der vorherigen Vorlesungen begegnet. Sie erinnern sich wahrscheinlich daran, dass Unicode ein Zeichenkodierungsstandard ist, der Zeichen aus fast allen Schriftsprachen der Welt umfasst. Mit anderen Worten handelt es sich um eine Liste spezieller Codes, in denen es für fast jedes Zeichen aus jeder Sprache einen Code gibt. Die allgemeine Unicode-Tabelle ist sehr umfangreich und muss natürlich nicht auswendig gelernt werden. Hier ist zum Beispiel ein Teil davon: Expansion und Kontraktion primitiver Typen - 5 Die Hauptsache ist, das Prinzip der Wertespeicherung zu verstehen charund sich daran zu erinnern, dass man den Code eines bestimmten Symbols immer im Programm abrufen kann, wenn man ihn kennt. Versuchen wir es mit einer Zufallszahl:
public static void main(String[] args) {

   int x = 32816;

   char c = (char) x ;
   System.out.println(c);
}
Konsolenausgabe: „ Dies ist das Format, in dem Zeichen in Java gespeichert werden char.“ Jedes Zeichen entspricht einer Zahl – einem numerischen Code aus 16 Bits oder zwei Bytes. Unicode 32816 entspricht dem Zeichen 耰. Achten Sie auf diesen Moment. In diesem Beispiel haben wir die Variable verwendet int. Es belegt 32 Bit Speicher , während es char16 sind . Hier haben wir uns entschieden , weil die von uns benötigte Nummer, 32816, außerhalb des zulässigen Bereichs liegt . Obwohl die Größe wie short 16 Bit beträgt, gibt es in dem Bereich keine negativen Zahlen, sodass der „positive“ Bereich doppelt so groß ist (65536 statt 32767 ). Wir können verwenden , solange unser Code im Bereich von 65536 liegt. Wenn wir jedoch eine Zahl erstellen , nimmt diese mehr als 16 Bit ein. Und wenn man die Typen eingrenzt: intshortcharcharcharshortintint >65536
char c = (char) x;
Die zusätzlichen Bits werden verworfen und das Ergebnis wird ziemlich unerwartet sein.

Merkmale der Addition von Zeichen und Ganzzahlen

Schauen wir uns dieses ungewöhnliche Beispiel an:
public class Main {

   public static void main(String[] args) {

      char c = '1';

      int i = 1;

       System.out.println(i+c);
   }
}
Konsolenausgabe: 50 O_O Wo ist die Logik? 1+1, woher kommen 50?! Sie wissen bereits, dass Werte charim Speicher als Zahlen im Bereich von 0 bis 65536 gespeichert werden, was den Unicode unseres Charakters darstellt. Expansion und Kontraktion primitiver Typen - 6 Also. Wenn wir eine Addition durchführen char, wird ein ganzzahliger Typ charin die Zahl konvertiert, die ihm in Unicode entspricht. Als wir in unserem Code 1 und „1“ hinzugefügt haben, wurde das Symbol „1“ in seinen Code umgewandelt, der 49 ist (Sie können es in der Tabelle oben überprüfen). Daher betrug das Ergebnis 50. Nehmen wir noch einmal unseren alten Freund -als Beispiel und versuchen, ihn mit einer Zahl zu addieren.
public static void main(String[] args) {

   char c = '耰';
   int x = 200;

   System.out.println(c + x);
}
Konsolenausgabe: 33016 Wir haben bereits herausgefunden, dass das dem Code 32816 entspricht. Und wenn wir diese Zahl und 200 addieren, erhalten wir genau unser Ergebnis – 33016 :) Der Funktionsmechanismus ist, wie Sie sehen, recht einfach.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION