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 :

  • du nombre de bits permettant le codage binaire d'une valeur numérique,
  • de l'ordre de la gamme des types, c'est-à-dire que les nombres à virgule flottante sont toujours plus larges que les entiers.
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.

typeG 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;
Opération unaire
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 binaire
  char 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.

byte 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;
Les gammes des types
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.