34 votes

Sans fin pour la boucle

J'ai la boucle suivante:

 for (byte i = 0 ; i < 128; i++) {
    System.out.println(i + 1 + " " + name);
}
 

Lorsque j'exécute mon programme, il imprime tous les nombres de -128 à 127 dans une boucle infinie. Pourquoi cela arrive-t-il?

79voto

Vladimir Points 110327

octet est un type à 1 octet, il peut donc varier entre -128 et 127, donc la condition i <128 est toujours vraie. Lorsque vous ajoutez 1 à 127, il déborde et devient -128 et ainsi de suite dans une boucle (infinie) ...

20voto

Jigar Joshi Points 116533

Après 127, quand il incrémente, il deviendra -128, de sorte que votre condition ne correspond pas .

octet: L' byte type de données est un signé 8 bits en complément à deux entier. Il a une valeur minimale de -128 et une valeur maximale de 127 (inclus). L' byte type de données peuvent être utiles pour économiser de la mémoire dans les grands ensembles, où les économies de mémoire qui importe réellement. Ils peuvent également être utilisés à la place de int où leurs limites vous aider à préciser votre code; le fait qu'une variable a une portée limitée, peut servir comme une forme de documentation.


Il fonctionne comme ceci:

0, 1, 2, ..., 126, 127, -128, -127, ...

8 bits peut représenter un signé nombre jusqu'à 127.

Voir ici pour les types de données primitifs.


L'image en dit plus que les mots alt text

11voto

paxdiablo Points 341644

Parce que les octets sont signés en Java, ils seront donc toujours inférieurs à 128.

Pourquoi Java a choisi les octets signés est un mystère du fond du temps. Je n'ai jamais pu comprendre pourquoi ils ont corrompu un type de données non signé parfaitement bon :-)

Essayez plutôt ceci:

 for (byte i = 0 ; i >= 0; ++i ) {
 

ou mieux encore:

 for (int i = 0 ; i < 128; ++i ) {
 

7voto

Itay Karo Points 10446

car lorsque i == 127 et que vous exécutez i ++, il déborde à -128.

6voto

Curd Points 4670

L'octet de type a une plage de -128..127. Donc i est toujours inférieur à 128.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X