Ganzzahldatentyp größer unsigned int
lima-city → Forum → Programmiersprachen → C/C++ und D
anforderung
befehl
bit
code
compiler
entsprechende methode
erweiterung
offizielle standard
programm
programmieraufwand
sandrock
speichern
spontan nix
system
tip
typ
variablen speichern
zahl
zerlegen
zustand
-
Hallo,
ich schreibe gerade ein Programm, dass Ganzzahlen bis ca. 10^10 in einer Variablen speichern muss. Der Datentyp unsigned int geht bis 4.294.967.295 (32Bit-System), ist also zu klein. Gibt es einen größeren Datentyp, der Ganzzahlen speichern kann?
Gruß
Jonas
edit:
In Java gibts noch long - der geht von –2^63 bis 2^63, wäre also groß genug. So was bräuchte ich für C++.
Beitrag geändert: 13.7.2008 17:14:15 von sandrock-jonas -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Im offizielle Standard gibt es noch nichts, aber die meisten Compiler unterstützen
mit einem maximalen Wert von 18446744073709551615.unsigned long long int foo;
€dit: http://home.att.net/~jackklein/c/inttypes.html#long
Beitrag geändert: 13.7.2008 17:21:54 von kochmarkus -
unsigned long long int hatte ich auch schon mittels Google gefunden, aber da motzt mein Compiler (G++), wenn ich eine Zahl in dieser Größenordnung speichern will:
Fehler: Ganzzahlkonstante ist zu groß für »long«-Typ -
unsigned long long int ist auch C only, für C++ fällt mir jetzt spontan nix ein.
€dit: Hab grad noch was gefunden, wenn du eine Konstante zuweisen will musst du ULL (für unsigned long long) mit anhängen, also z. B. so:
#include <iostream> using namespace std; int main(void) { unsigned long long int foo = 500000000000ULL; cout << foo << endl; }
Funktioniert mit g++, beim VC6 ist es übrigens nicht nötig ULL mit dranzuhängen.
Beitrag geändert: 13.7.2008 17:55:25 von kochmarkus -
Ok, mit Konstanten funktioniert das, aber ich brauche es für Variablen, die zur Laufzeit zugewiesen werden.
Ich hab\' mittels Google auch noch so was wie __int64 gefunden, aber das scheint irgendwas von Microsoft zu sein und funktioniert mit g++ nicht. -
Funktioniert bei mir auch:
#include <iostream> #include <cmath> using namespace std; int main(void) { unsigned long long int foo; cout << \"Grosse Zahl: \"; cin >> foo; //z. B.: 10000000000 cout << foo << endl; //Ausgabe: 10000000000 unsigned long long int bar = pow(10.0,10); cout << bar << endl; }
Beitrag geändert: 19.7.2008 17:12:15 von kochmarkus -
Zitat: Der Datentyp unsigned int geht bis 4.294.967.295 (32Bit-System), ist also zu klein.
Unter 32-Bit geht da leider auch nicht mehr bei int, zumindest nicht ohne Programmieraufwand.
Wenn man damals unter Asm eine grössere als die max möglichste Zahl haben wollte, hatte man einfach den Wert überlaufen lassen, wenn der Wert übergelaufen war, einfach nur den entsprechenden Stack abgefragt und den Rest in das nächste Feld geschoben.
d.h. es gibt da eine entsprechende Methode die Zahlen zu zerlegen, leider habe ich mich mit diesem Thema nicht näher beschäftigt, daher kann ich dir in dieser richtung keine tipps geben.
ansonsten kannst du es mit double noch probieren, da dieser typ eigentlich solch einen überlauf von hause aus unterstützt (und damit 64 bit simuliert), allerdings weiss ich nicht ob der datentyp deinen Anforderungen entspricht
Das kann man bei c++ auch mit den mmx Erweiterungen simulieren wenn man unbedingt int haben will, benötigt aber glaub ich entsprechenden asm befehl um dies zu aktivieren und den Stack-zustand auszulesen.
Beitrag geändert: 24.7.2008 19:40:01 von raanubis -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage