Laden...

Bei Quadrierung von Ganzzahlen entsteht eine negative Zahl

Erstellt von Johannes1509 vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.080 Views
J
Johannes1509 Themenstarter:in
1 Beiträge seit 2016
vor 8 Jahren
Bei Quadrierung von Ganzzahlen entsteht eine negative Zahl

Hallo Community,

ich selbst bin absoluter C# - Anfänger und stieß vor kurzer Zeit auf folgendes Phänomen:

int i = 0;
while(true) {
 Console.WriteLine("Quadrat: "+(i*i)+" Wert von i: "+i);
 i++;
}

(Der Sinn ist zu vernachlässigen)

Intressant ist hierbei, dass zum Beispiel bei i = 55000 eine NEGATIVE Quadratzahl entsteht, was ich mir nicht erklären kann, da aus der Multiplikation zwei positiver Ganzahl sowie aus der Multiplikation zweier negativer Ganzzahlen immer eine positive Zahl entsteht.

Gerne würde ich wissen warum also eine negative Zahl entsteht.

Hinweis: Ich hörte mal etwas von einem "Ganzahlen Überlauf" (Integer Overflow) vllt. hat es irgendwas damit zu tun...

MfG
Johannes

Hinweis von Abt vor 8 Jahren

Bitte in Zukunft Edit Funktion nutzen.

S
506 Beiträge seit 2006
vor 8 Jahren

Lies dir mal etwas über das Zweierkomplement durch.

3.003 Beiträge seit 2006
vor 8 Jahren

Deine Vermutung ist richtig, und Stu42s Hinweis ist die theoretische Erklärung dahinter.

Kurz und knapp: int geht von Int32.MinValue (-2.147.483.648) bis Int32.MaxValue (2.147.483.647). Ergebnisse, die außerhalb dieses Bereichs liegen, sind mit Int32 nicht darstellbar. Der Versuch, sie darzustellen, resultiert u.U. in negativen Zahlen, weil -> Wikipedia 2er-Komplement.

Um das zu vermeiden, kannst du andere Typen außer Int32 verwenden, die einen anderen Wertebereich darstellen können. Beispiel wäre decimal oder Int64.

LaTino
Ah, WP hat auch direkt einen Artikel zum Überlauf: Arithmetischer Überlauf

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

1.029 Beiträge seit 2010
vor 8 Jahren

Hi,

für sehr große Zahlen kann man auch https://msdn.microsoft.com/de-de/library/system.numerics.biginteger(v=vs.110).aspx verwenden.

Nur der Vollständigkeit halber.

LG