C Zuweisungsoperator

sman

Cadet 4th Year
Registriert
Jan. 2007
Beiträge
70
Hallo Leute,

seit einigen wochen beschäftigen wir uns in der schule mit dem c-programmieren und mir ist da heute beim basteln etwas aufgefallen vll. ist jemand so nett und erklärt es mir.

Code:
#include <stdio.h>

int main(){
   int j,zahl = 10;
   for (j=0; j<20; j++){
        zahl *= 10;
        printf("%d\n\n",zahl);
	}
   system("pause");
   return 0;
}

So sieht der code aus, warum bekomm ich denn beim 9ten Durchlauf eine so krumme zahl raus? Normalerweiße müsste mir doch der wert immer mit 10 Multipliziert werden und der Variable zahl neu zugewiesen werden.
Wo ist mein Fehler?
 
Das liegt daran, dass eine int-Variable normalerweise 4 Byte im Speicher belegt und deine Zahl einfach zu groß wird, wenn du 10^10 rechnest!

Gruß
BlackMark
 
ja ok das hab ich auch schon vermutet aber selbst wenn ich einen anderen datentyp verwende long int dann funktioniert das nicht. wie müsste denn mein code aussehen damit es funktioniert?
 
Das hängt unter anderem vom Compiler ab, aber ein "unsigned long long" sollte dir 8 Byte für positive Zahlen geben.

Wenn du mehr willst, dann musst du dir eine Bibliothek suchen, wie zB "Big Integer", wo du dann auch mit sehr großen Zahlen arbeiten kannst.

Gruß
BlackMark
 
Schon mal mit Datentypen und Wertebereiche ausseinander gesetzt?
Also dein Werterbereich zu klein, siehe hier; Versuchs mal mit Double die haben 8 Byte; Da sollte mehr gehen;
 
@M0rpHeU5: Naja wenn man nur mit Ganzzahlen hantiert, würde ich auf Double vezichten.
Und zudem liegt der Wertebereich, der mit Double möglich ist, nicht nur an den 8 Bytes, sondern an der Codierung dieser... (IEEE-754)
 
hm also double bringt mir ja nix wenn ich nur mit ganzzahlen arbeite und das mit dem long long int scheint auch nicht wirklich zu funktionieren da bekomm ich die meldung "too many types in declaration".
 
Könntest du den genauen Code posten und sagen welchen Compiler du verwendest?

Gruß
BlackMark
 
10^10 = 10 Millarden und long int bis +/-2,4 Millarden; Also reicht nicht aus;

Du hast aber natürlich recht das in der Codierung der Werttypen liegt ob es klapt oder nicht; Aber als ersten Versuch mal auf Double zu gehen wäre doch was? Obs Effizient ist sei mal dahingestellt; Aber Warum sollte man auch sinnlos in einer For-Schleife auf 10^10 potenzieren? Wenns dumm läuft erkennt der Compiler dies, und optimiert dir das weg; Also er macht ein Lineares Programm daraus;

@BlackMark :: Du hast recht, hab meine Auffassung versucht etwas deutlich zu machen; hab ein long zuwenig gelesen;
 
Zuletzt bearbeitet:
10^10 = 10,000,000,000
unsigned long long = 18,446,744,073,709,551,615

Nichts 2.4 Milliarden!

Edit:
Ich habe übersehen, dass du von long int sprichst, aber auch wenn es long int ist, dann stimmen die 2.4 Milliarden nicht:
long int --> -2,147,483,648 bis 2,147,483,647

Sind also nur +/-2.1 Milliarden!

Gruß
BlackMark
 
Zuletzt bearbeitet:
Wieso eigentlich 10^10? Wie kommt ihr darauf?

es ist 10^20...
100.000.000.000.000.000.000
18.446.744.073.709.551.615 <-- reicht nicht
 
Ich verwende den Borland C++ Compiler

so sieht mein Programmcode aus:

Code:
#include <stdio.h>

int main(){
	unsigned long long zahl = 10;
   int j;

   for (j=0; j<20; j++){
        zahl *= 10;
        printf("%ld\n\n",zahl);
	}
   system("pause");
   return 0;
}

aber so sagt er mir das zuviele typen in der deklaration sind, ich hab es auch schon mit long long, long int probiert aber vergebens. was für ein typenzeichen% müsste ich denn überhaupt bei long long angeben?

Wieso eigentlich 10^10? Wie kommt ihr darauf?

es ist 10^20...
100.000.000.000.000.000.000
18.446.744.073.709.551.615 <-- reicht nicht

naja das mit der 20 ist ja nur ein beispiel es könnte meinetwegen auch 15 in der for-schleife drinstehen. es geht mir jetzt eig. nur um das wissen wie es denn mit dem datentyp unsingend long long funktioniert.
 
Zuletzt bearbeitet:
Versuch mal "unsigned __int64" anstatt "unsigned long long", das sollte mit Borland C++ funktionieren!

Das ist jedoch eine Eigenheit des Compilers und nicht standardkonformes C!

Gruß
BlackMark
 
Argh, Schande über mein Haupt; Ich sollte anständig lesen; Sowohl bei der Problemstellung hier und bei der Angaben von Werten; Im Link steht es ja richtig referenziert drin;

Hab was per Zufall gegoogled :: Borland C++ Builder #include <iostream> ist aber C++ für unsigned long long int;

Laut Wikipedia könnte :: #include <stdint.h> plattformunabhängige Definition von Ganzzahltypen evtl. weiterhelfen

// No Warranty!
 
Hey,

stdint.h ist eine Header-Datei für C, wenn man unter C++ programmiert, sollte man wenn dann "cstdint" includen.

Gruß,
stwe
 
Zuletzt bearbeitet:
@stwe: Der TE programmiert ja auch in C und nicht in C++, deshalb ist <stdint.h> schon in Ordnung!

Der Borland C++ Compiler kann, wie die meisten C++ Compiler, auch ganz normales C kompilieren!

Gruß
BlackMark
 
So hab nochmal etwas rumprobiert und auch mal mit einem anderen Compiler versucht mit dem hat es ohne Probleme funktioniert. Ich bedanke mich für eure Hilfe =)
 
Zurück
Oben