Zum Inhalt springen
  • 0

Warum wird dauernd die 50 ausgegeben? (Java)


Fisinym

Frage

Hallo zusammen, ich habe nur eine kurze Frage - und zwar: 

Wenn ich besagten Code kompiliere, gibt die Konsole im Sekundentakt die Zahl "50" aus, obwohl Sie sie meinem Verständnis nach nur einmal ausgeben sollte, da ja "a" nur für eine Wdh. den Wert 50 annimmt. Kann mich jemand aufklären, warum das so ist?

 

 

 

Screenshot 2022-10-17 164820.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

8 Antworten auf diese Frage

Empfohlene Beiträge

  • 1
vor 5 Minuten schrieb Fisinym:

Dass es keine Abbruchbedingung gibt, war mir bewusst - nur gehört zur Anweisung "System.out.println" ja die if-Bedingung "a==50" - deswegen macht es ja trotz der unendlichen while-Schleife keinen Sinn, dass die 50 mehrmals ausgespuckt wird, oder? a müsste doch unendlich lange um 1 erhöht werden, aber wie schon erwähnt nur 1x 50 sein und auch nur während diesem einen Durchgang dann ausgegeben werden - heißt in der Konsole stünde

Alles hat ein Ende. (Nur die Wurst hat zwei.) ;)

Ein Integer ist 32 Bits groß. Also ist der Zahlenbereich beschränkt. Nämlich von -2147483648 bis 2147483647. Das höchste Bit wird als Vorzeichen gezählt.

Wenn du unendlich um 1 erhöhen könntest, würdest du irgendwann mehr als 32 Bits benötigen. Das passiert aber nicht. Das kann man sich halt wie eine Uhr vorstellen, die ja auch wieder von Vorne anfängt.

Hier mal die binäre Schreibweise:

0111 1111 1111 1111 1111 1111 1111 1111 =  2147483647 (höchster Wert)
Um 1 erhöht:
1000 0000 0000 0000 0000 0000 0000 0000 = -2147483648 (niedrigster Wert)


1111 1111 1111 1111 1111 1111 1111 1111 = -1
Um 1 erhöht:
0000 0000 0000 0000 0000 0000 0000 0000 =  0

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1
vor 5 Minuten schrieb Fisinym:

Edit: sehe gerade, dass ich in dem Post noch einmal geschrieben "a wäre nur einmal 50", ich glaube daran hat es gelegen, dass du dachtest, ich verstehe es nicht - habe mich ziemlich dumm ausgedrückt :D Aber a ist also alle 50 + 2^31 -1 Durchläufe =50, und deshalb spuckt die Konsole in etwa jede Sekunde 1x die Zahl 50 aus, richtig, oder?

Richtig. Dauert halt eine kleine Zeit, bis er wieder dort angekommen ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 3 Stunden schrieb KeeperOfCoffee:

Das liegt daran, dass du hier eine StackOverFlowException auslöst.

Nein, eben nicht. Sonst wäre nur eine 50 zu sehen. ;)

Wenn man auf die maximale Zahl eine 1 addiert, erhält man die minimalste Zahl und umgekehrt

public static void main(String[] args) {
  int a = Integer.MAX_VALUE;
  System.out.println(a++); //  2147483647
  System.out.println(a);   // -2147483648
}

Das Inkremenieren von a in Zeile 14 wird also fröhlich ausgeführt, macht einen Überlauf und kommt irgendwann bei der 50 wieder an.

Fun Fact: Das Verhalten macht sich Minecraft zu Nutze, indem ein Timer eine Variable vom Typ long hochzählt. Ist der Wert wieder bei 0, ist ein Tag vorbei.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

Ah, wieder was gelernt. Ist in C# wohl auch so, gerade in ner Fiddle getestet. Muss man erst mal drauf kommen sowas zu machen. Würde solch ein "Verhalten" niemals ausnutzen, ist zwar wohl gewolltes Verhalten, aber wäre mir trotzdem zu "hacky" ...

 

Ich würde dennoch sagen, dass die IDE wohl den Überlauf erkennt und die Anwendung killt.

Bearbeitet von KeeperOfCoffee
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

Also erstmal danke an alle :) Bezüglich dem formatieren, dachte ich mir schon dass das kommt :D hätte ich echt machen sollen, sorry 🤦‍♂️

 

vor 15 Stunden schrieb be98:

Licht bleibt immer true. Du hast keine Abbruchbedingung für deine while-schleife.du könntest lich auf falsche setzen wenn a = 50. Außerdem formatiere das bitte sauberer.

Dass es keine Abbruchbedingung gibt, war mir bewusst - nur gehört zur Anweisung "System.out.println" ja die if-Bedingung "a==50" - deswegen macht es ja trotz der unendlichen while-Schleife keinen Sinn, dass die 50 mehrmals ausgespuckt wird, oder? a müsste doch unendlich lange um 1 erhöht werden, aber wie schon erwähnt nur 1x 50 sein und auch nur während diesem einen Durchgang dann ausgegeben werden - heißt in der Konsole stünde

Zitat

 

Das Licht ist an!

50 

 

 

und danach passiert wird a unendlich lang weiter erhöht, aber nie wieder ausgegeben

 

 

 

 

vor 11 Stunden schrieb Whiz-zarD:

Nein, eben nicht. Sonst wäre nur eine 50 zu sehen. ;)

Wenn man auf die maximale Zahl eine 1 addiert, erhält man die minimalste Zahl und umgekehrt

public static void main(String[] args) {
  int a = Integer.MAX_VALUE;
  System.out.println(a++); //  2147483647
  System.out.println(a);   // -2147483648
}

Das Inkremenieren von a in Zeile 14 wird also fröhlich ausgeführt, macht einen Überlauf und kommt irgendwann bei der 50 wieder an.

Fun Fact: Das Verhalten macht sich Minecraft zu Nutze, indem ein Timer eine Variable vom Typ long hochzählt. Ist der Wert wieder bei 0, ist ein Tag vorbei.

 

Das macht für mich am meisten Sinn, daran wird es denke ich mal auch liegen wenn ich eure Antworten alle richtig verstanden habe. Der Abstand ist nämlich auch ziemlich groß zwischen den "50", heißt es würde passen dass a einfach überläuft in der Zwischenzeit.

 

Danke euch allen :) 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 40 Minuten schrieb Whiz-zarD:

Alles hat ein Ende. (Nur die Wurst hat zwei.) ;)

Ein Integer ist 32 Bits groß. Also ist der Zahlenbereich beschränkt. Nämlich von -2147483648 bis 2147483647. Das höchste Bit wird als Vorzeichen gezählt.

Wenn du unendlich um 1 erhöhen könntest, würdest du irgendwann mehr als 32 Bits benötigen. Das passiert aber nicht. Das kann man sich halt wie eine Uhr vorstellen, die ja auch wieder von Vorne anfängt.

Hier mal die binäre Schreibweise:

0111 1111 1111 1111 1111 1111 1111 1111 =  2147483647 (höchster Wert)
Um 1 erhöht:
1000 0000 0000 0000 0000 0000 0000 0000 = -2147483648 (niedrigster Wert)


1111 1111 1111 1111 1111 1111 1111 1111 = -1
Um 1 erhöht:
0000 0000 0000 0000 0000 0000 0000 0000 =  0

 

Danke dir dass du dir nochmal die Mühe machst, aber hatte deine Antwort vorher schon verstanden :D:D 

Du hast bestimmt gesehen dass ich dir geantwortet habe, und deswegen nochmal geschrieben, oder? 

Dein Zitat war ganz unten in meiner Antwort- darauf hatte ich geschrieben, dass das für mich sinnig ist und ich das Problem jetzt verstehe. Wollte mit der Antwort, die du jetzt zitiert hast, nur nochmal verdeutlichen, dass die Antworten die vor deiner Lösung genannt wurden in meinen Augen nicht die Lösung beinhalten - denn diese "Lösungen" hatte ich ja selber erst einmal im Kopf.

Aber die Erklärung war auf jeden Fall nochmal top, hätte ich es vorher nicht verstanden wäre es spätestens jetzt in meiner letzten Gehirnzelle angekommen 😆 Also danke dir sehr :)

LG

 

Edit: sehe gerade, dass ich in dem Post noch einmal geschrieben "a wäre nur einmal 50", ich glaube daran hat es gelegen, dass du dachtest, ich verstehe es nicht - habe mich ziemlich dumm ausgedrückt :D Aber a ist also alle 50 + 2^31 -1 Durchläufe =50, und deshalb spuckt die Konsole in etwa jede Sekunde 1x die Zahl 50 aus, richtig, oder?

Bearbeitet von Fisinym
Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...