Soit le code suivant :
Le resultat est :Code:
1
2
3
4
5
6
7
8 public static void main(String args[]) { byte b = 1; System.out.println(++b); while(++b>0) ; System.out.println(b); }
Pourquoi le -128?Code:
1
2
3 2 -128
Version imprimable
Soit le code suivant :
Le resultat est :Code:
1
2
3
4
5
6
7
8 public static void main(String args[]) { byte b = 1; System.out.println(++b); while(++b>0) ; System.out.println(b); }
Pourquoi le -128?Code:
1
2
3 2 -128
Parce que le type byte est signé, de -128 à +127, et qu'il n'y a pas de contrôle d'overflow sur les opérations arithmétiques.
Deux choses :
- les bytes, nombres stockés sur 1 octet, pouvant prendre 256 valeurs différentes, sont signés. Ça veut dire qu'ils peuvent être négatifs. Leur ensemble de valeurs est de -128 à 127
Oui, c'est débile, je trouve aussi.
- quand on fait des opérations sur des nombres et qu'on dépasse leur capacité, ils "tournent" en recommençant par la valeur qui se trouve à l'autre côté. Pour un byte, après 127, on passe à -128. Et si on enlève 1 à -128, on passe à 127.
Pour un int, on passe de 2147483647 à -2147483648.
C'est très souvent comme ça dans les langages de programmation. De toute façon il n'y a pas le choix, quand on utilise des types stockés sur un nombre fixe d'octets.
Conclusion : ta boucle augmente la valeur de b, jusqu'à dépasser la capacité des bytes, ce qui le fait passer à la valeur négative la plus basse, -128.
Parce que un Byte représente un entier et tient sur un octet (256 valeurs possible). Mais c'est un entier signé. Le bit de poid le plus fort représente en réalité le signe de l'entier.
Donc la valeur du byte va de -128 à 127
-128 se code x80 en hexa
-1 se code xFF
0 se code x00
et 127 se code x7F
Lorsque tu rajoute 1 à 127, tu passe de x7F à x80, et donc de 127 à -128.
Dans d'autre langage tu aurais une exception de dépassement de capacité. Ca n'existe pas en Java ?