96 votes

Pourquoi i = i + i me donne-t-il 0?

J'ai un programme simple:

public class Mathz {
    static int i = 1;
    public static void main(String[] args) {    
        while (true){
            i = i + i;
            System.out.println(i);
        }
    }
}

Lorsque j'exécute ce programme, tout ce que je vois est - 0 pour i de ma sortie. Je me serais attendu le premier tour, nous aurions i = 1 + 1, suivie par l' i = 2 + 2, suivie par l' i = 4 + 4 etc.

Est-ce dû au fait que dès que l'on essaie de re-déclarer i sur la gauche, sa valeur est remis à l' 0?

Si quelqu'un peut me pointer dans les détails de ce qui serait formidable.

Modifier l' int de long et il semble être l'impression de numéros comme prévu. Je suis surpris de voir à quelle vitesse il frappe le max de 32 bits de la valeur!

334voto

Ali Gajani Points 5445

Introduction

Le problème de dépassement d'entier. S'il déborde, il va revenir à la valeur minimale et continue à partir de là. Si il underflows, il va revenir à la valeur maximale et continue à partir de là. L'image ci-dessous est un compteur kilométrique. Je l'utilise pour expliquer les débordements. C'est une mécanique de débordement, mais un bon exemple encore.

Dans un Odomètre, l' max digit = 9, afin d'aller au-delà du maximum de moyens 9 + 1, qui transporte plus et donne un 0 ; Cependant, il n'est pas plus élevé chiffres de changer pour un 1, le compteur se réinitialise zero. Vous avez l'idée - "débordements d'entiers" viennent à l'esprit maintenant.

enter image description hereenter image description here

Le plus grand décimal littéral de type int est 2 147 483 647 (231-1). Tous virgule des littéraux de 0 à 2 147 483 647 peut apparaître n'importe où int littérale peut apparaître, mais le littéral 2147483648 pourrait n'apparaître que comme l' opérande de l'opérateur de négation unaire -.

Si un nombre entier plus les débordements, alors le résultat est le faible commande bits de mathématiques de la somme représentée dans certaines suffisamment grand en complément à deux sur format. Si le dépassement se produit, alors le signe de la le résultat n'est pas le même que le signe de la mathématique somme des deux opérande valeurs.

Ainsi, 2147483647 + 1 déborde et s'enroule autour d' -2147483648. Par conséquent int i=2147483647 + 1 serait débordé, ce qui n'est pas égal à 2147483648. Aussi, dites-vous "c'est toujours affiche "0". Il ne le fait pas, parce que http://ideone.com/WHrQIW. Ci-dessous, ces 8 chiffres montrent que le point auquel il pivots et les débordements. Il commence alors à imprimer 0s. Aussi, ne soyez pas surpris comment rapidement il calcule, les machines d'aujourd'hui sont rapides.

268435456
536870912
1073741824
-2147483648
0
0
0
0

Pourquoi débordement d'entier ", s'enroule autour de"

PDF Original

168voto

Louis Wasserman Points 67557

Le problème est dû à un dépassement d'entier.

En arithmétique 32 bits à deux compléments:

i commence effectivement par avoir des valeurs de puissance de deux, mais les comportements de débordement commencent dès que vous atteignez 2 30 :

2 30 + 2 30 = -2 31

-2 31 + -2 31 = 0

... en int arithmétique.

46voto

peter.petrov Points 18093

Non, il n’imprime pas que des zéros.

Changez-le en ceci et vous verrez ce qui se passe.

     int k = 50;
    while (true){
        i = i + i;
        System.out.println(i);
        k--;
        if (k<0) break;
    }
 

Ce qui se passe s'appelle débordement.

15voto

TrungTran05T3 Points 220
 static int i = 1;
    public static void main(String[] args) throws InterruptedException {
        while (true){
            i = i + i;
            System.out.println(i);
            Thread.sleep(100);
        }
    }
 

out mis:

 2
4
8
16
32
64
...
1073741824
-2147483648
0
0

when sum > Integer.MAX_INT then assign i = 0;
 

4voto

Kaify Points 61

Comme je n’ai pas assez de réputation, je ne peux pas poster l’image de la sortie du même programme en C avec une sortie contrôlée, vous pouvez essayer vous-même et voir qu’elle s’imprime 32 fois, puis comme expliqué en raison d’un débordement i = 1073741824 + 1073741824 passe à -2147483648 et un autre ajout supplémentaire est hors de portée de int et passe à zéro .

 #include<stdio.h>
#include<conio.h>

int main()
{
static int i = 1;

    while (true){
        i = i + i;
      printf("\n%d",i);
      _getch();
    }
      return 0;
}
 

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