lundi 27 août 2012

Les nombres non signés en Java

Voici la liste des types primitifs en Java

TypeSignificationTaille (en octets)Plage de valeurs acceptées
charCaractère Unicode2'\u0000' → '\uffff' (0 à 65535)
byteEntier très court1-128 → +127
shortEntier court2-32 768 → +32 767
intEntier4-231≈-2,147×109 → +231-1≈2,147×109
longEntier long8-263≈-9,223×1018 → +263-1≈9,223×1018
floatNombre réel simple4±2-149≈1.4×10-45 → ±2128-2104≈3.4×1038
doubleNombre réel double8±2-1074≈4,9×10-324 → ±21024-2971≈1,8×10308
booleanValeur logique (booléen)1true (vrai), ou false (faux)

Ce que l'on constate, c'est qu'il n'y a que des nombres non signé.
Si vous lisez un fichier binaire et que vous récupérer un octet (byte), naturellement, vous vous attendez à un nombre non signé.

Mais, voilà, Java ne vois pas les choses de la sorte.
Alors comment avoir la valeur d'un byte non signé ?
L'astuce est plutôt simple quoique déconcertante :
final DataInputStream file = ...
int byte0 = file.readByte() & 0xff ;
En appliquant un masque 0xff et en le mettant dans un int, on force Java à ne pas interpréter le contenu du byte.
Exemple, si le byte = -127, le signe disparait et la valeur voulue (255) est récupérée.

Aucun commentaire:

Enregistrer un commentaire