Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Fakultät von Int wird bei 22 negativ, dann wieder positiv
NiggiBS
myCSharp.de - Member



Dabei seit:
Beiträge: 17

Themenstarter:

Fakultät von Int wird bei 22 negativ, dann wieder positiv

beantworten | zitieren | melden

Ich habe aus Langeweile ein kleines Programm geschrieben (C#-Konsolenprogramm ohne GUI), das die Fakultät (1*2*3*4* ... *n) einer eingegebenen Zahl errechnet.
Zuerst habe ich die resultierende Zahl in einer Variable vom Typ "int" gespeichert. Da die Fakultät einer Zahl sehr schnell sehr gross werden kann war das aber natürlich die falsche Wahl. Ich habe mich dann für "double" entschieden.
Mir ist nun aufgefallen, dass ich, als die Zahl noch als "int(32)" gespeichert wurde, keine fehlermeldung o.Ä. bekommen habe. Allerdings passierte folgendes: bei der Zahl 22 wurde mir eine ziemlich hohe negative Zahl ausgegeben; bei 23 ab 23 wurde die Zahl wieder positiv, war aber nicht korrekt. Hat wer ne Idee, wieso das so ist, bzw. wie die Zahl abgespeichert wird, wo doch die Variable zu klein ist?

Hier der Code:
(fakultät ist die besagte Variable)

        static void fakultät_rechner(int eingabe)
        {
            for(int i = 1; i ≤ eingabe; i++)
            {
                fakultät *= i;               
            }
            Console.Write("!{0} = {1}", eingabe, fakultät);
            Console.ReadLine();
        }
private Nachricht | Beiträge des Benutzers
Spook
myCSharp.de - Member



Dabei seit:
Beiträge: 241
Herkunft: Esslingen a.N.

beantworten | zitieren | melden

22! viel größer als Int32.MaxValue (2^31-1)
Daher hast du Überläufe vom Positiven ins Negative und wieder zurück.

Mit BigInteger sollte es gehen.
private Nachricht | Beiträge des Benutzers
MartinH
myCSharp.de - Member

Avatar #avatar-1761.gif


Dabei seit:
Beiträge: 183
Herkunft: Asperg

beantworten | zitieren | melden

Das kommt daher, da das höchstwertigste Bit bei Int das Vorzeichen darstellt.
Wenn du UInt nimmst, hast du das Vorzeichen nicht, da hättest du keinen negativen Wert bekommen.
Wenn die Zahl zu groß wird, hast du einen Überlauf, dann stimmt das Ergebnis nicht mehr.
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3.003
Herkunft: Thüringen

beantworten | zitieren | melden

Die Gründe für das Verhalten wurden ja bereits erklärt (siehe auch: Arithmetischer Überlauf)

Noch kurz was zu deinem Code: es mag nur eine Kleinigkeit sein, aber solang du die Sprache kennenlernst und herumprobierst, tust du dir selbst einen großen Gefallen, wenn du dir eine durchgehende, einheitliche Syntax angewöhnst. Es gibt dafür in C# Konventionen: [Artikel] C#: Richtlinien für die Namensvergabe (das hilft auch anderen, deinen Code schneller zu verstehen). Umlaute solltest du ganz weglassen :).

LaTino
"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)
private Nachricht | Beiträge des Benutzers
NiggiBS
myCSharp.de - Member



Dabei seit:
Beiträge: 17

Themenstarter:

beantworten | zitieren | melden

Danke an alle

Ich nehme nun bei der besagten Methode den Typ "double".
Damit habe ich keine Überläufe mehr.
Nur bei sehr grossen Zahlen heisst es dann "+unendlich"
private Nachricht | Beiträge des Benutzers