certification java

OCPJP 6 – Jour 6 – Les types primitifs et les constantes littérales

Les types primitifs permettent de manipuler directement les données les plus courantes. Ces données sont notamment spécifiées par une représentation en mémoire, et donc à un nombre d’octets prédéfinis. Chacun des types primitifs peut être « enveloppé » dans un objet provenant d’une classe prévue à cet effet et appelée Wrapper (mot anglais signifiant enveloppeur). Les enveloppeurs sont donc des objets représentant un type primitif.

6.1 – Les types primitifs

Java dispose d’un certain nombre de types de base dits primitifs, permettant de manipuler des entiers, des flottants, des caractères et des booléens. Les types primitifs sont de type byte, short, int, long, float, double, boolean et char.

Ces types primitifs sont représentés en base 2 sous forme de bits dans la mémoire. 8 bits représentent 1 octet.

6.1.1 – Les types entiers

Le premier bit permet de stocker le signe (0 pour positif et -1 pour négatif), on parle d’entier signé, et les autres bits à stocker :

  • la valeur absolue du nombre pour les entiers positifs
  • le complément à deux du nombre pour les entiers négatifs

primitif
Pour le type primitif byte, il y a donc 256 valeurs possibles avec le bit de signe.
Voici l’intervalle de valeurs possibles :

Bit de signevaleur minimalevaleur maximale
00000000 (0)1111111 (127)
11111111 (-128)0000001 (-1)

L’intervalle négatif est toujours décalé d’une valeur par rapport à l’intervalle positif. En effet la valeur maximale de l’intervalle négatif est -1 et la valeur minimale de l’intervalle positif est 0. La valeur 0 est contenue dans l’intervalle positif et est toujours codée d’une seule manière (0 0000000).

L’intervalle se calcule de cette façon :

  • positif : 2(bits – 1) – 1
  • négatif : 2(bits – 1)
bitsoctetsvaleur minimalevaleur maximale
Byte81-27 (-128)27 – 1 (127)
short162-215 (-32768)215 – 1 (32767)
int324-231 (-2,147×109)231 – 1 (2,147×109)
long648-263 (-9,223×1018)263 – 1 (9,223×1018)

Pour retrouver la valeur d’un nombre négatif, on utilise une méthode appelée complément à deux. Cette méthode se résume en deux étapes :

  • on inverse les bits de la valeur absolue du nombre négatif
  • on ajoute 1

Exemple pour la valeur -42 pour un byte :
primitif

Les dépassements de capacité ne sont jamais signalés et le compilateur ne génère pas d’erreur. Si l’on ajoute 1 au plus grand nombre positif d’un short par exemple (ici 0111111111111111 ou 32767 en décimal) on obtient… le plus petit nombre négatif possible (ici 1111111111111111, soit -32768 en décimal).

Exemple :

6.1.2 – Les types flottants

Les types flottants permettent de représenter, de manière approchée, une partie des nombres réels. Pour ce faire, ils s’inspirent de la notation dite scientifique (ou exponentielle) bien connue qu’on trouve dans 1.5×4218 ou 0.642×10-12. Dans une telle notation, on nomme mantisses (partie entière + partie fractionnaire) les quantités telles que 1.5 ou 0.642 et exposants les quantités telles que 18 ou -12.

Un nombre réel sera représenté en flottant en déterminant un signe s (+1 ou -1) et deux quantités M (mantisse) et E (exposant) telles que :

sM.2E

Les nombres de type float sont codés sur 32 bits dont :

  • 23 bits pour la mantisse
  • 8 bits pour l’exposant
  • 1 bit pour le signe

Les nombres de type double sont codés sur 64 bits dont :

  • 52 bits pour la mantisse
  • 11 bits pour l’exposant
  • 1 bit pour le signe

bitsoctetsPrécision (chiffres significatifs)valeur minimalevaleur maximale
float32471.40239846e-453.40282347e38
double648154.9406564584124654e-3241.797693134862316e308

6.1.3 – Le type caractère

Contrairement à certains langages, Java représente les caractères en mémoire sur 2 octets (donc sur 16 bits) en utilisant le code universel Unicode. Il offre donc 65 536 combinaisons qui permettent de représenter la plupart des symboles utilisés dans le monde.

Le type char est un peu particulier dans la mesure où on peut lui affecter une valeur entière positive (de 0 à 65 536). Même si celui-ci est codé sur autant de bits que le type short, le type char offre d’avantage de possibilités car il ne faut pas oublier qu’un bit est réservé au signe pour le type short.

6.1.4 – Le type booléen

Une variable de type boolean ne peut prendre que deux valeurs à savoir : true et false. Cependant, la taille d’un booléen en mémoire dépend de la JVM.

6.1.5 – Conversion d’un nombre en base N en base décimale

Pour passer d’un nombre en base N à un nombre en base décimale, on peut appliquer la méthode suivante :

Soit K le nombre en base N à convertir. Pour tout chiffre c de rang r dans K, on calcule c*N r. La représentation de K en base dix est la somme de tous les produits.
Le comptage de r commence à zéro de la droite vers la gauche.

Exemple :

Le nombre 10110 en base binaire s’écrit en base 10 :

1×24 + 0×23 + 1×22 + 1×21 + 0×20 = 22 (base 10)

Exemple :

Le nombre 3FA en base seize s’écrit en base décimale :

3×162 + 15×161 + 10×160 = 1 018 (base 10)

Rappel : F en base hexadécimale vaut 15 en base décimale et A vaut 10.

6.1.5 – Conversion d’un nombre en base décimale en base N

La méthode la plus simple reste la suite de divisions euclidiennes car celle-ci ne dépend pas de la base. Elle reste aussi la méthode la plus simple à appliquer en programmation.

Exemple : conversion en base décimale du nombre 4289 écrit en base hexadécimale (base 16) :


Il s’agit d’effectuer une suite de divisions euclidiennes par 16.

En juxtaposant les restes des divisions euclidiennes de droite à gauche et sachant que le nombre 12 en base 16 correspond au symbole C, nous obtenons le nombre 10C1 en base 16.


Java-6-Variables-Division-Euclidienne


6.2 – Les constantes littérales

6.2.1 – Les constantes entières

En Java, il existe trois possibilités de représenter des constantes entières :

  • sous forme décimale
  • sous forme octale
  • sous forme hexadécimale

…sous forme décimale


La façon la plus naturelle d’introduire une constante entière dans un programme est de l’écrire sous forme décimale usuelle, avec ou sans signe, comme dans ces exemples :


…sous forme octale


Pour représenter un entier sous forme octale, un chiffre 0 doit précéder la valeur exprimée en base 8 (chiffres de 0 à 7) :

Le code précédent affichera sur la sortie standard :


…sous forme hexadécimale


Les nombres hexadécimaux sont exprimés en base 16 et construits à partir de 16 symboles : 10 chiffres (0 à 9) et 6 lettres (a, b, c, d, e et f). Pour utiliser une notation hexadécimale, la valeur doit être précédée de 0x ou 0X. La casse n’a aucune importance dans la notation hexadécimale, ainsi Ox2a est équivalent à OX2A.

Par défaut ces valeurs sont toujours définies par Java comme des valeurs de type int. Il est possible de forcer une constante entière à être de type long en ajoutant à la valeur la lettre l ou L :

6.2.2 – Les constantes flottantes

Les constantes flottantes peuvent s’écrire indifféremment suivant l’une des deux notations :

  • décimale
  • exponentielle

…sous forme décimale

Une constante flottante sous forme décimale se présente sous la forme d’une suite de chiffres (partie entière), un point et une suite de chiffres (partie fractionnaire).
La partie entière ou la partie fractionnaire peut être omise. Voici quelques exemples corrects :

…sous forme exponentielle

Une constante flottante sous forme exponentielle se présente sous la forme d’une suite de chiffres (partie entière), un point qui joue le rôle de virgule, une suite de chiffres (partie fractionnaire), la lettre e (ou E) et suivi d’une suite de chiffres (l’exposant). La partie entière ou la partie fractionnaire peut être omise ; de même le point ou l’exposant peut être omis. Voici quelques exemples :

Par défaut ces valeurs sont toujours définies par Java comme des valeurs de type double. Cela implique qu’une affectation telle que la suivante pose problème :

L’exemple précédent provoquera l’erreur suivante :

Il est possible de forcer une constante flottante à être de type float en ajoutant à la valeur la lettre f ou F :

Il est tout à fait possible mais inutile d’ajouter la lettre d ou D à la valeur d’une constante flottante de type double :

L’utilisation d’une virgule au lieu d’un point entrainera une erreur du compilateur :

6.2.3 – Les constantes de type caractère

Une constante de type caractère se note de façon classique entre apostrophe :

De plus, il est possible de définir une constante de type caractère en utilisant des caractères Unicode sous la forme suivante ‘\uxxxx’

Comme nous l’avons vu précedemment, une constante de type char peut aussi être affectée d’une valeur entière positive (de 0 à 65 536).

Attention cependant si la valeur n’es pas contenue dans l’intervalle de 0 à 65 536, une conversion de type char sera obligatoire, sous peine d’obtenir des erreurs de compilation.

6.2.4 – Les constantes booléennes

Une constante booléenne (type boolean) ne peut avoir que deux valeurs true (vrai) et false (faux).


Auteur
AuteurEdouard WATTECAMPS

0 réponses

Répondre

Se joindre à la discussion ?
Vous êtes libre de contribuer !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *