La promotion numérique permet de rendre compatible le type des opérandes avant qu'une opération arithmétique ne soit effectuée.
int a = 12; short b = 15; int resultat = a + b; // Promotion numérique int resultat = a + (int)b;
Une conversion (cast) vers le type le plus large de l'une des opérandes est appliquée implicitement à l'opérande possèdant le type le moins large.
Un type large est déterminé en fonction :
Type | Codage |
---|---|
byte | 8 bits |
short | 16 bits |
char | 16 bits |
int | 32 bits |
long | 64 bits |
float | 32 bits |
double | 64 bits |
Le résultat d'une opération binaire ou unaire est toujours un nombre de type int, long, float ou double.
Opération unairetypeG opérandeG; typeD opérande_droite; typeR resultat = opérandeG opérateur; // ou typeR resultat = opérateur opérandeG; typeR resultat = opérandeG opérateur opérandeD;
typeG | char | byte | short | int | long | float | double |
---|---|---|---|---|---|---|---|
typeR | int | int | int | int | long | float | double |
Une opération unaire sur des nombres de type int, long, float ou double ne nécessite aucune promotion numérique puisque le type résultant est identique.
Opération binairechar | byte | short | int | long | float | double | |
---|---|---|---|---|---|---|---|
char | int | int | int | int | long | float | double |
byte | int | int | int | int | long | float | double |
short | int | int | int | int | long | float | double |
int | int | int | int | int | long | float | double |
long | long | long | long | long | long | float | double |
float | float | float | float | float | float | float | double |
double | double | double | double | double | double | double | double |
Les types byte et short ne sont pas compatibles avec le type char bien que les premiers soient inférieurs ou égaux en terme de largeur, mais ne font pas partis de la même gamme de types.
Les gammes des typesbyte a = 10; short b = 12; char c = a; char d = b; // produisent une erreur de compilation // possible loss of precision char a = 'c'; int b = a; // est équivalent à int b = (int)a; // b = 99;
Gamme | Types |
---|---|
Caractères | char |
Nombres entiers | byte, short, int, long |
Nombres à virgule flottante | float, double |
En résumé, le type plus large conserve toujours la prédominance sur l'autre type dans une opération arithmétique binaire.