[Einführung in Java] Informationen zur Typkonvertierung (Besetzung, Promotion)

Zweck

Für diejenigen, die gerade angefangen haben, Programmieren einschließlich der Java-Sprache zu lernen, und diejenigen, die es bereits gelernt haben, zur Überprüfung Ich schreibe, um die Typkonvertierung zu lernen.

Letztes Mal habe ich etwas über [Variationen und Typen] gelernt (https://qiita.com/morioheisei/items/3d27e82d6cd88068dded). Diesmal über ** Typkonvertierung **.

[Einführung in Java]

Typkonvertierung

Es dient zur Konvertierung des Datentyps. Hier erfahren Sie, wie es geht.

-Implizite Typkonvertierung ・ Typumwandlung nach Besetzung

Schauen wir uns jeden an.

Implizite Typkonvertierung

Es ist möglich, einen großen Typ durch einen kleinen Typ zu ersetzen. Selbst wenn wir Programmierer den Typ nicht explizit konvertieren, wird er beim Kompilieren konvertiert.

Die Ersetzung vom linken zum rechten Typ ist in Ordnung! byte → short、char → int → long → float → double

Main.java


class Main {
  public static void main(String args[]) {
    int number = 10;

    //Die Typnummer int wird zum Typ float
    float numberFloat = number;

    System.out.println(numberFloat); // 10.0 ← mit einem Dezimalpunkt
  }
}

** Bitte beachten Sie, dass eine implizite Typkonvertierung für Folgendes nicht möglich ist. ** ** ** ・ Wenn Sie den Zeichentyp in den Kurztyp ändern ・ Wenn Sie den Kurztyp in den Zeichentyp ändern Beide sind 16-Bit-Datentypen, aber der Wertebereich, der verarbeitet werden kann, ist unterschiedlich. Sie müssen die Typkonvertierung durch Casting durchführen, wie unten beschrieben.

Main.java


class Main {
  public static void main(String args[]) {
    //・ Char → kurz
    char a = 100;
    //Ich bekomme eine Fehlermeldung
    // short b = a; // Type mismatch: cannot convert from char to short
    
    short b = (short) a; //Konvertierung in kurze Typ-für-Typ-Konvertierung durch Besetzung
    System.out.println(b); // 100

    

    //・ Kurz → char
    short c = 100;
    //Ich bekomme eine Fehlermeldung
    // char d = c; // Type mismatch: cannot convert from short to char
    
    char d = (char) c; //Konvertierung in char Typ für Typ Konvertierung durch Besetzung
    System.out.println(d); // d
  }
}

-Es ist unmöglich, einen kleinen Typ durch einen großen Typ zu ersetzen. Ein Kompilierungsfehler wird auftreten. Die Substitution vom rechten zum linken Typ ist NG! byte → short、char → int → long → float → double

Main.java


class Main {
  public static void main(String args[]) {
    int numberInt = 10;

    //Sie können keinen großen Typ einem kleinen Typ zuweisen.
    byte numberByte = numberInt; // Type mismatch: cannot convert from int to byte

    System.out.println(numberByte);
  }
}

Beachten Sie außerdem, dass aufgrund der folgenden Typkonvertierungen ** die Gefahr eines Genauigkeitsverlusts besteht.

Main.java


class Main {
  public static void main(String args[]) {
    //Definieren Sie eine Variable mit dem Maximalwert jedes Typs
    int intMax = Integer.MAX_VALUE;
    long longMax = Long.MAX_VALUE;
    float floatMax = Float.MAX_VALUE;

    //Die Anzahl der effektiven Ziffern vom Typ float beträgt 7 Dezimalstellen(24 Ziffern binär)
    
    // int → float
    float floatFromIntMax = intMax;
    System.out.println(intMax); // 2147483647
    //↓ Der Wert nach 7 effektiven Ziffern geht verloren (andere Ergebnisse als vor der Typkonvertierung)
    System.out.println(floatFromIntMax); // 2.14748365E9

    // long → float
    float floatFromLongMax = longMax;
    System.out.println(longMax); // 9223372036854775807
    //↓ Der Wert nach 7 effektiven Ziffern geht verloren (andere Ergebnisse als vor der Typkonvertierung)
    System.out.println(floatFromLongMax); // 9.223372E18


    //Die Anzahl der effektiven Ziffern vom Doppeltyp beträgt ungefähr 15 Dezimalstellen(53 Ziffern in Binärform)

    // long → double
    double doubleFromLongMax = longMax;
    System.out.println(longMax); // 9223372036854775807
    //↓ Werte nach 15 gültigen Ziffern gehen verloren (andere Ergebnisse als vor der Typkonvertierung)
    System.out.println(doubleFromLongMax); // 9.223372036854776E18

    // float → double
    double doubleFromFloatMax = floatMax;
    System.out.println(floatMax); // 3.4028235E38
    //↓ Werte nach 15 gültigen Ziffern gehen verloren (andere Ergebnisse als vor der Typkonvertierung)
    System.out.println(doubleFromFloatMax); // 3.4028234663852886E38

  }
}

Typkonvertierung durch Besetzung

Sie können keinen großen Typ einem kleinen Typ zuweisen. Führen Sie die Typkonvertierung explizit mit ** () ** cast operator durch.

Main.java


class Main {
  public static void main(String args[]) {
    double numberDouble = 3.14;

    //Sie können keinen großen Typ einem kleinen Typ zuweisen.
    // int numberInt = numberDobule; // Type mismatch: cannot convert from double to int

    //Mit dem Cast-Operator zwangsweise in den Typ int konvertiert
    int numberInt = (int)number; 
    System.out.println(numberInt); //Wird als 3 ausgegeben
  }
}

Bitte beachten Sie, dass einige Muster nicht konvertiert werden können. Zeichenfolgen können mit dem Cast-Operator nicht in den Typ int konvertiert werden.

Main.java


class Main {
  public static void main(String args[]) {
    //Beispiele, die nicht konvertiert werden können
    String str = "Guten Morgen";
    int num = (int)str; // Cannot cast from String to int
    System.out.println(str);
  }
}

** Hinweise zum Casting **

Bitte beachten Sie, dass einige Daten aufgrund der Typkonvertierung durch Casting verloren gehen.

Main.java


class Main {
  public static void main(String args[]) {
    short x = 257; //16 Bit-> 0000 0001 0000 0001
    byte y = (byte)x; //8 Bits-> 0000 0001
    System.out.println(y); //Wird als 1 ausgegeben
  }
}

Main.java


class Main {
  public static void main(String args[]) {
    //Bei der Konvertierung von einer kleinen Zahl in eine Ganzzahl werden die Ziffern nach dem Dezimalpunkt abgeschnitten.
    double d = 10.23;
    int i = (int)d;
    System.out.println(i); //Wird als 10 ausgegeben

    float f = 33.44f;
    int i2 = (int)f;
    System.out.println(i2); //33 wird ausgegeben
  }
}

Promotion (Promotion)

Java führt möglicherweise automatisch Typkonvertierungen durch, die nicht vom Programmierer beabsichtigt sind. Dies wird unten erklärt.

Wenn einer der Operanden (Operationsziel) vom Typ Long ist und der andere Operand nicht vom Typ Float oder Double, wird der andere Operand in den Typ Long konvertiert.

Main.java


class Main {
  public static void main(String args[]) {
    int a = 1;
    long b = 2;

    //Die Variable a wird vor der Operation in einen langen Typ konvertiert
    int c = a + b; // Type mismatch: cannot convert from long to int
  }
}

↓ ** Lösung **

Main.java


class Main {
  public static void main(String args[]) {
    int a = 1;
    long b = 2;

    int c = (int)(a + b); //Der Fehler verschwindet, indem das Operationsergebnis in den Typ int umgewandelt wird.
    System.out.println(c); // 3
  }
}

Wenn einer der Operanden (Operationsziel) vom Typ float ist und der andere Operand nicht vom Typ double, wird der andere Operand in den Typ float konvertiert.

Main.java


class Main {
  public static void main(String args[]) {
    int a = 1;
    float b = 2.0f;

    //Die Variable a wird vor der Operation in den Float-Typ konvertiert
    int c = a + b; // Type mismatch: cannot convert from float to int
  }
}

↓ ** Lösung **

Main.java


class Main {
  public static void main(String args[]) {
    int a = 1;
    float b = 2.0f;

    int c = (int)(a + b); //Der Fehler verschwindet, indem das Operationsergebnis in den Typ int umgewandelt wird.
    System.out.println(c); // 3
  }
}

Wenn einer der Operanden (Berechnungsziel) vom Doppeltyp ist, wird der andere Operand in den Doppeltyp konvertiert.

Main.java


class Main {
  public static void main(String args[]) {
    int a = 1;
    double b = 2.0;

    //
    int c = a + b; // Type mismatch: cannot convert from double to int
  }
}

Main.java


class Main {
  public static void main(String args[]) {
    int a = 1;
    double b = 2.0;

    int c = (int)(a + b); //
    System.out.println(c); // 3
  }
}

Main.java


class Main {
  public static void main(String args[]) {
    byte a = 1;
    byte b = 2;

    //,
    byte c = a + b; // Type mismatch: cannot convert from int to byte
  }
}

↓ ** Lösung ** Der Fehler verschwindet, indem das Operationsergebnis in den Typ int umgewandelt wird. Wenn der Operand (Operationsziel) weder vom Typ long, vom Typ float noch vom Typ double ist, werden beide Operanden in den Typ int konvertiert. Die Variable ab wird vor der Operation in den Typ int konvertiert ↓ ** Lösung **

Main.java


class Main {
  public static void main(String args[]) {
    byte a = 1;
    byte b = 2;

    byte c = (byte)(a + b); //Der Fehler verschwindet, indem das Berechnungsergebnis in den Bytetyp umgewandelt wird.
    System.out.println(c); // 3
  }
}

Ich denke, dass Werbung (Promotion) zu unbeabsichtigten Ergebnissen und Fehlern führen kann. Sie müssen zum Zeitpunkt der Berechnung vorsichtig mit der numerischen Werbung sein.

Am Ende

Ich habe etwas über Typkonvertierung gelernt. Nächstes Mal werde ich mich mit [Variablem Umfang] befassen (https://qiita.com/morioheisei/items/c56ab32b68ce92d32206).

Recommended Posts

[Einführung in Java] Informationen zur Typkonvertierung (Besetzung, Promotion)
[Einführung in Java] Über Lambda-Ausdrücke
[Einführung in Java] Informationen zur Stream-API
[Java] Einführung in Java
Einführung in Java
[Grundkenntnisse in Java] Informationen zur Typkonvertierung
Typkonvertierung vom Java Big Decimal-Typ zum String-Typ
Einführung in den Java-Befehl
Der [Java] char-Typ kann in den int-Typ umgewandelt werden
[Java] Konvertierung des Datumstyps
Deklaration / Initialisierung / Datentyp der Java-Variablen (Cast und Promotion)
[Java] Hinweise zur Typinferenz in Java 10
[Java] Konvertierung von Listentyp / Array-Typ
[Java] Vergleich der Geschwindigkeit der Typkonvertierung
[Java] Einführung in den Lambda-Ausdruck
[Java] Einführung in die Stream-API
Java Primer Series (Typkonvertierung)
[Einführung in Janken (ähnliche) Spiele] Java
Einführung in die funktionale Programmierung (Java, Javascript)
Erste Einführung in Mac (Java-Ingenieur)
[Java] Konvertierung von Array zu Liste
Verwendung des Java-Aufzählungstyps
[Einführung in Java] Informationen zu Variablen und Typen (Variablendeklaration, Initialisierung, Datentyp)
[Einführung in Java] Informationen zur Ausnahmebehandlung (try-catch-finally, aktivierte Ausnahme, nicht aktivierte Ausnahme, Würfe, Würfe)
[Java Siler] Informationen zur Typinferenz von var
[Java] Implizite Typumwandlung (AOJ10-Summe von Zahlen)
Konvertierung des Java-Datumsdatentyps (Datum, Kalender, Zeichenfolge)
Einführung in Java zum ersten Mal # 2
[Java ~ Informationen zur Variablendefinition und Typkonvertierung ~] Studiennotiz
Über das Verfahren, damit Java funktioniert
Java-Studie Nr. 3 (Typkonvertierung und Befehlsausführung)
Einführung in Algorithmen mit Java-Suche (Tiefenprioritätssuche)
So führen Sie eine Basiskonvertierung in Java durch
[Einführung in Java] So schreiben Sie ein Java-Programm
[Java] Konvertiert Null vom Objekttyp in String-Typ
[Einführung in Java] Informationen zu Array-Operationen (1D-Array, 2D-Array-Deklaration, Instanziierung, Initialisierung und Verwendung)
Ausgabe des Buches "Einführung in Java"
[Java] Einführung
Einführung in die Überwachung von Java Touching Prometheus
[Einführung in Java] Informationen zu Variablendeklarationen und -typen
Einführung in Kotlin für iOS-Entwickler ④-Typ
Java 8 LocalDateTime-Typkonvertierung (String, java.util.Date)
[Java] Berechnungsmechanismus, Operatoren und Typkonvertierung
[Einführung in Java] Informationen zur iterativen Verarbeitung (while, do-while, for, Erweiterung für, break, continue)
Einführung in Algorithmen mit Java --Search (Breitenprioritätssuche)
Einführung in Algorithmen mit Java --Search (Bit Full Search)
Road to Java Engineer Teil 1 Einführung & Umgebungskonstruktion
Informationen zu in Java verwendeten Variablen (lokaler Variablentyp)
[Monatlich 2017/04] Einführung in groovy !! ~ Java Grammatik / Spezifikationsvergleich ~
Die Geschichte des Versuchs, JAVA File zu bedienen
Einführung in Kotlin für iOS-Entwickler ③-About gradle
Java-Typkonvertierung (String, int, Datum, Kalender usw.)
Erste Schritte mit Groovy für problematische Java-Ingenieure
[Einführung in Java] Grundlagen der Java-Arithmetik (für Anfänger)
Einführung in Ruby 2
Über die Java-Schnittstelle
[Java] Informationen zu Java 12-Funktionen