[Introduction à Java] À propos de la conversion de type (distribution, promotion)

Objectif

Pour ceux qui viennent de commencer à apprendre la programmation, y compris le langage Java, et ceux qui l'ont déjà appris, pour examen J'écris pour apprendre la conversion de type.

La dernière fois, j'ai découvert Variations et types. Cette fois, à propos de la ** conversion de type **.

[Introduction à Java]

Conversion de type

Il s'agit de convertir le type de données. Voici comment procéder.

-Conversion de type implicite ・ Conversion de type par fonte

Regardons chacun d'eux.

Conversion de type implicite

Il est possible de remplacer un petit type par un grand type. Même si nous, les programmeurs, ne convertissons pas explicitement le type, il convertira le type au moment de la compilation.

La substitution du type de gauche au type de droite est OK! byte → short、char → int → long → float → double

Main.java


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

    //le nombre de type int devient un type flottant
    float numberFloat = number;

    System.out.println(numberFloat); // 10.0 ← avec un point décimal
  }
}

** Veuillez noter que la conversion de type implicite n'est pas possible pour ce qui suit. ** ** ・ Lors du changement de type de caractère en type court ・ Lors du changement de type court en type de caractère Les deux sont des types de données 16 bits, mais la plage de valeurs pouvant être gérée est différente. Vous devez effectuer la conversion de type par diffusion décrite ci-dessous.

Main.java


class Main {
  public static void main(String args[]) {
    //・ Char → court
    char a = 100;
    //J'obtiens une erreur
    // short b = a; // Type mismatch: cannot convert from char to short
    
    short b = (short) a; //Conversion en type court par type Conversion par diffusion
    System.out.println(b); // 100

    

    //・ Court → caractère
    short c = 100;
    //J'obtiens une erreur
    // char d = c; // Type mismatch: cannot convert from short to char
    
    char d = (char) c; //Conversion en type de caractère par conversion de type par diffusion
    System.out.println(d); // d
  }
}

-Il est impossible de remplacer un gros type par un petit type. Une erreur de compilation se produira. La substitution du type droit au type gauche est NG! byte → short、char → int → long → float → double

Main.java


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

    //Vous ne pouvez pas attribuer d'un grand type à un petit type.
    byte numberByte = numberInt; // Type mismatch: cannot convert from int to byte

    System.out.println(numberByte);
  }
}

Veuillez également noter qu'il existe un risque de perte de précision en raison des conversions de type suivantes **.

Main.java


class Main {
  public static void main(String args[]) {
    //Définissez une variable avec la valeur maximale de chaque type
    int intMax = Integer.MAX_VALUE;
    long longMax = Long.MAX_VALUE;
    float floatMax = Float.MAX_VALUE;

    //Le nombre de chiffres effectifs du type float est de 7 chiffres en décimal(24 chiffres en binaire)
    
    // int → float
    float floatFromIntMax = intMax;
    System.out.println(intMax); // 2147483647
    //↓ Les valeurs après 7 chiffres effectifs sont perdues (les résultats différents de ceux avant la conversion de type sont émis)
    System.out.println(floatFromIntMax); // 2.14748365E9

    // long → float
    float floatFromLongMax = longMax;
    System.out.println(longMax); // 9223372036854775807
    //↓ Les valeurs après 7 chiffres effectifs sont perdues (les résultats différents de ceux avant la conversion de type sont émis)
    System.out.println(floatFromLongMax); // 9.223372E18


    //Le nombre de chiffres effectifs de type double est d'environ 15 chiffres en décimal(53 chiffres en binaire)

    // long → double
    double doubleFromLongMax = longMax;
    System.out.println(longMax); // 9223372036854775807
    //↓ Les valeurs après 15 chiffres effectifs sont perdues (résultats différents de ceux avant la conversion de type sont émis)
    System.out.println(doubleFromLongMax); // 9.223372036854776E18

    // float → double
    double doubleFromFloatMax = floatMax;
    System.out.println(floatMax); // 3.4028235E38
    //↓ Les valeurs après 15 chiffres effectifs sont perdues (résultats différents de ceux avant la conversion de type sont émis)
    System.out.println(doubleFromFloatMax); // 3.4028234663852886E38

  }
}

Conversion de type par distribution

Vous ne pouvez pas attribuer d'un grand type à un petit type. Effectuez explicitement la conversion de type à l'aide de ** () ** cast operator.

Main.java


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

    //Vous ne pouvez pas attribuer d'un grand type à un petit type.
    // int numberInt = numberDobule; // Type mismatch: cannot convert from double to int

    //Converti de force en type int à l'aide de l'opérateur cast
    int numberInt = (int)number; 
    System.out.println(numberInt); //Est sortie comme 3
  }
}

Veuillez noter que certains modèles ne peuvent pas être convertis. Les chaînes de caractères ne peuvent pas être converties en type int à l'aide de l'opérateur de conversion.

Main.java


class Main {
  public static void main(String args[]) {
    //Exemples qui ne peuvent pas être convertis
    String str = "Bonjour";
    int num = (int)str; // Cannot cast from String to int
    System.out.println(str);
  }
}

** Remarques sur la diffusion **

Veuillez noter que certaines données seront perdues en raison de la conversion de type par diffusion.

-Lorsque le type est converti d'une grande taille à une petite taille, la valeur du bit de poids fort est tronquée (débordement de données).

Main.java


class Main {
  public static void main(String args[]) {
    short x = 257; //16 bits-> 0000 0001 0000 0001
    byte y = (byte)x; //8 bits-> 0000 0001
    System.out.println(y); //Est sortie comme 1
  }
}

-Lors de la conversion d'un petit nombre en un entier, les chiffres après la virgule décimale sont tronqués.

Main.java


class Main {
  public static void main(String args[]) {
    //De plus, lors de la conversion d'un petit nombre en un entier, les chiffres après la virgule décimale sont tronqués.
    double d = 10.23;
    int i = (int)d;
    System.out.println(i); //Est sortie comme 10

    float f = 33.44f;
    int i2 = (int)f;
    System.out.println(i2); //33 est la sortie
  }
}

Promotion (promotion)

Java peut effectuer automatiquement des conversions de type qui ne sont pas prévues par le programmeur. Ceci est expliqué ci-dessous.

Si l'un des opérandes (cible de l'opération) est de type long et l'autre opérande n'est pas de type float ou de type double, l'autre opérande sera converti en type long.

Main.java


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

    //La variable a est convertie en type long avant l'opération
    int c = a + b; // Type mismatch: cannot convert from long to int
  }
}

↓ ** Solution **

Main.java


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

    int c = (int)(a + b); //L'erreur disparaît en convertissant le résultat de l'opération en type int.
    System.out.println(c); // 3
  }
}

Si l'un des opérandes (cible d'opération) est de type float et l'autre opérande n'est pas de type double, l'autre opérande sera converti en type float.

Main.java


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

    //La variable a est convertie en type flottant avant l'opération
    int c = a + b; // Type mismatch: cannot convert from float to int
  }
}

↓ ** Solution **

Main.java


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

    int c = (int)(a + b); //L'erreur disparaît en convertissant le résultat de l'opération en type int.
    System.out.println(c); // 3
  }
}

Si l'un des opérandes (cible du calcul) est de type double, l'autre opérande sera converti en type double.

Main.java


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

    //La variable a est convertie en type double avant l'opération
    int c = a + b; // Type mismatch: cannot convert from double to int
  }
}

↓ ** Solution **

Main.java


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

    int c = (int)(a + b); //L'erreur disparaît en convertissant le résultat de l'opération en type int.
    System.out.println(c); // 3
  }
}

Si l'opérande (cible du calcul) n'est pas de type long, de type flottant ou de type double, les deux opérandes seront convertis en type int.

Main.java


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

    //Variable a avant calcul,b est converti en type int
    byte c = a + b; // Type mismatch: cannot convert from int to byte
  }
}

↓ ** Solution **

Main.java


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

    byte c = (byte)(a + b); //L'erreur disparaît en convertissant le résultat du calcul en type d'octet.
    System.out.println(c); // 3
  }
}

Je pense que la promotion (promotion) peut entraîner des résultats et des erreurs involontaires. Vous devez faire attention à la promotion numérique au moment du calcul.

À la fin

J'ai appris la conversion de type. La prochaine fois, je me pencherai sur Variable Scope.

Recommended Posts

[Introduction à Java] À propos de la conversion de type (distribution, promotion)
[Introduction à Java] À propos des expressions lambda
[Introduction à Java] À propos de l'API Stream
[Java] Introduction à Java
Introduction à Java
[Connaissance de base de Java] À propos de la conversion de type
Conversion de type du type java Big Decimal au type String
Introduction à la commande java
[Java] le type char peut être converti en type int
[Java] Conversion de type de date
Déclaration / initialisation de variable Java / type de données (distribution et promotion)
[Java] Points à noter sur l'inférence de type étendue dans Java 10
[Java] Conversion de type de liste / type de tableau
[Java] Comparaison de la vitesse de conversion de type
[Java] Introduction à l'expression lambda
[Java] Introduction à l'API Stream
Java Primer Series (conversion de type)
[Introduction aux jeux Janken (comme)] Java
Introduction à la programmation fonctionnelle (Java, Javascript)
Introduction initiale à Mac (ingénieur Java)
[Java] Conversion d'un tableau à une liste
Comment utiliser le type enum Java
[Introduction à Java] À propos des variables et des types (déclaration de variable, initialisation, type de données)
[Introduction à Java] À propos de la gestion des exceptions (try-catch-finally, exception vérifiée, exception non vérifiée, throws, throw)
[Java Siler] À propos de l'inférence de type par var
[Java] Conversion de type implicite (somme AOJ10 de nombres)
Conversion de type de données de date Java (date, calendrier, chaîne)
Introduction à Java pour la première fois # 2
[Java ~ A propos de la définition de variable et de la conversion de type ~] Note d'étude
À propos de la procédure pour que Java fonctionne
Etude Java n ° 3 (conversion de type et exécution d'instruction)
Introduction aux algorithmes avec java-Search (recherche prioritaire en profondeur)
Comment faire une conversion de base en Java
[Introduction à Java] Comment écrire un programme Java
[Java] Convertit null du type Object en type String
[Introduction à Java] À propos des opérations de tableau (tableau 1D, déclaration de tableau 2D, instanciation, initialisation et utilisation)
Sortie du livre "Introduction à Java"
[Java] Introduction
Introduction à la surveillance à partir de Java Touching Prometheus
[Introduction à Java] À propos des déclarations et des types de variables
Introduction à kotlin pour les développeurs iOS ④-type
Conversion de type Java 8 LocalDateTime (String, java.util.Date)
[Java] Mécanisme de calcul, opérateurs et conversion de type
[Introduction à Java] À propos du traitement itératif (while, do-while, for, extension for, break, continue)
Introduction aux algorithmes avec java --Search (recherche de priorité de largeur)
Introduction aux algorithmes avec java --Search (bit full search)
Ingénieur en route vers Java Partie 1 Introduction et construction de l'environnement
À propos de var utilisé en Java (type de variable locale)
[Mensuel 2017/04] Introduction à groovy !! ~ Comparaison de grammaire / spécification Java ~
Histoire d'essayer de faire fonctionner le fichier JAVA
Introduction à kotlin pour les développeurs iOS ③-À propos de gradle
Conversion de type Java (chaîne, entier, date, calendrier, etc.)
Premiers pas avec Groovy pour les ingénieurs Java gênants
[Introduction à Java] Bases de l'arithmétique Java (pour les débutants)
Introduction à Ruby 2
À propos de l'interface Java
[Java] À propos des fonctionnalités de Java 12