Falsche Ausgabe ab 11 Ziffern
-
Hallo Community!
Bin noch Anfänger in C und habe ein Problem, dass sich niemand erklären kann. Meine Aufgabe ist es, eine 12-stellige Zahl einzulesen, sie dann zu verarbeiten, und dann wieder auszugeben. Mein Programm ist generell richtig geschrieben, mein Problem beginnt schon zu beginn:
#include <stdio.h> int main() { int zahl; scanf("%d",&zahlen); printf("%d\n",zahlen); return 0; }
Wenn ich nur eine 10-stellige Zahl eingebe funktioniert alles, sobald ich aber mehr eingebe, kommt eine Minuszahl raus! Bei anderen Leuten funktioniert das, hab es jetzt aber schon bei 2 PCs ausprobiert. Wo ist mein Problem? Ich programmieren übrigens mit CodeBlocks.
MFG und danke schon Mal
Zoltamor
-
Wenn ich raten müsste würde ich sagen, die eingegebenen Zahlen sind einfach zu groß um in einen int zu passen. Was willst du denn überhaupt mit diesen großen Zahlen machen, nachdem sie eingelesen sind?
-
Zoltamor schrieb:
...Mein Programm ist generell richtig geschrieben,
#include <stdio.h> int main() { int zahl; scanf("%d",&zahlen); printf("%d\n",zahlen); return 0; }
Ja wirklich?
Jeder C Compiler wird sich weigern, diesen Code zu übersetzen.
-
Dann mach mal:
#include <stdio.h> #include <limits.h> int main() { printf("INT_MAX=%d\n",INT_MAX); return 0; }
Und zähl dann mal die Stellen der Zahl
-
@Wutz das hilft mir leider auch nicht weiter...
Und es stimmt wohl, dass die Zahl einfach zu groß ist für einen normalen Integer! Deshalb müsste ein long integer das Problem lösen, da ich unter einem 64bit System arbeite, aber auch das hat nichts gebracht.
Deshalb hab ich es jetzt mit einem long long int probiert, und siehe da, es funktioniert. Auch wenn es nicht ganz logisch ist
Naja trotzdem danke!
MFG Zoltar
-
#include <stdio.h> int main() { int zahl; scanf("%d",&zahlen); printf("%d\n",zahlen); return 0; }
Auf was Wutz hinaus wollte, ist vermutlich die ungültige Variable "zahlen", die niemals deklariert wurde. Ein Compiler würde dies anmerken.
int zahl;
scanf("%d",&zahlen);
Vermutlich hast du dich da aber auch nur beim abtippen vertippt.
-
Zoltamor schrieb:
Deshalb hab ich es jetzt mit einem long long int probiert, und siehe da, es funktioniert. Auch wenn es nicht ganz logisch ist
Es ist ganz logisch.
Vereinfacht:
Ein long ist 4 Byte groß, egal ob es 32- oder 64-Bit System.
Erst das long long nutzt die 64 Bit aus.char 1 Byte short 2 Byte int 2 oder 4 Byte ! long 4 Byte long long 8 Byte
Ausnahmen sind möglich. Die Typgrößen sind stark Systemabhängig.
Festgelegt ist, dass der Werteberich vonint
zwischenshort
undlong
liegt.Würde man beim Umstieg auf 64Bit das long vergrößern, würden sehr viele Programme nach demm neucompilieren Schwierigkeiten haben.
-
@DirkB: "Ausnahmen sind möglich" ist wohl ein bisschen untertrieben. Das macht z.B. der gcc, einer der bedeutendsten Compiler, ganz anders als das was du hier als allgemeine Regel aufstellst.
@Threadersteller: Man kann sich nur auf die Mindestgrößen im Standard verlassen, wenn man die konkreten maximalen Werte haben will, dann lass dir mal die Werte aus deiner limits.h ausgeben (siehe dieser Beitrag) und vergleiche, was für die verschiedenen Typen bei dir rauskommt.
-
SeppJ schrieb:
as macht z.B. der gcc, einer der bedeutendsten Compiler, ganz anders als das was du hier als allgemeine Regel aufstellst.
Was ist denn da ganz anders?
-
DirkB schrieb:
SeppJ schrieb:
as macht z.B. der gcc, einer der bedeutendsten Compiler, ganz anders als das was du hier als allgemeine Regel aufstellst.
Was ist denn da ganz anders?
Ein long ist 4 Byte groß, egal ob es 32- oder 64-Bit System.
Erst das long long nutzt die 64 Bit aus.Stimmt zum Beispiel gar nicht.
Würde man beim Umstieg auf 64Bit das long vergrößern, würden sehr viele Programme nach demm neucompilieren Schwierigkeiten haben.
Tja, haben sie aber.
-
Zoltamor schrieb:
Deshalb hab ich es jetzt mit einem long long int probiert, und siehe da, es funktioniert. Auch wenn es nicht ganz logisch ist
Aber auch mit long long ist irgendwann Schluss. Das einzige, was man (abgesehen von Bignums) tun kann, ist eine Fehlermeldung zu machen, wenn die Eingabe eine zu grosse Zahl ist. Solche Dinge sind nicht gerade die Stärke von C. Ich hab da einmal so etwas ähnliches für unsigned long gemacht, das kann man an diesen Fall anpassen:
http://www.c-plusplus.net/forum/265593?start=5