Welcher Datentyp für große Zahlen?

24/11/2009 - 17:32 von Dominik Schmidt | Report spam
Hallo,

ich bin neu in C/C++ (ich beschrànke mich derzeit auf C++).

Ich bin grundsàtzlich am überlegen, wie ich Variablen deklarieren sollte,
die numerische Werte enthalten.
Wenn ich mir irgendwelche Beispielcodes durchlese, werden solche Variablen
immer als Integer (int var;) deklariert.
Nun Frage ich mich, ob es nicht grob fahrlàssig ist, so vorzugehen.

In einem Beispiel habe ich gelesen, wie die Größe einer Datei ermittelt
wird, das Ergebnis wird in einer Integer-Variable gespeichert. Das
funktioniert natürlich hervorragend bei kleinen Dateien. Aber es gibt eine
Grenze (ich glaube etwa 2 GB?).
Meine Vermutung hat sich bestàtigt, als ich die Größe einer 7 GB großen
Datei ermitteln wollte: Es kam ein unsinniger (negativer) Wert heraus.

Was wàre also die sauberste und beste Vorgehensweise, um in solchen Fàllen
(wenn man also Zahlen unbekannter Größe bekommt) den größten Datentyp
wàhlt, der existiert?

Ich habe in meinem Fall einfach als long long deklariert (soll angeblich
bis 9223372036854775807 gehen?), dann hat die Sache funktioniert, hier noch
der Code:

long long GetFileSize(string FilePath)
{
long long Out1 = -1;
ifstream file1;
file1.open (FilePath.c_str());
if (file1.is_open())
{
file1.seekg(0, ios::end);
Out1 = file1.tellg();
}
file1.close();

return Out1;
}
 

Lesen sie die antworten

#1 Georg Bauhaus
24/11/2009 - 18:39 | Warnen spam
Dominik Schmidt schrieb:

In einem Beispiel habe ich gelesen, wie die Größe einer Datei ermittelt
wird, das Ergebnis wird in einer Integer-Variable gespeichert.



Long, vermutlich?

Was wàre also die sauberste und beste Vorgehensweise, um in solchen Fàllen
(wenn man also Zahlen unbekannter Größe bekommt) den größten Datentyp
wàhlt, der existiert?



Sauber ist nur eines, nàmlich genau diejenigen Datentypen zu
wàhlen, die in solchen Fàllen vorgesehen sind.

(Die Antworten in d.c.l.c werden vermutlich für C gegeben,
für C++ (eine andere Sprache, trotz historischer
Überlappungen, besonders auch bei den I/O-Klassen vs
den C-Funktionen) wird von woanders Hilfe wahrscheinlicher sein.)

Wenn du die Frage nach Typen für Ganzzahl-I/O oder -Nutzung so
allgemein formulierst: Wie soll, ganz technisch, eine zu große Zahl
in eine Variable eines zu kleinen Datentyps gespeichert
werden können? Geht nicht wirklich.

Wenn die Frage spezieller auf Dateioperationen zielt:
Für eine gegebene C-Implementierung kann der Datentyp int
2G - 1 nichnegative Werte umfassen. Das muss aber für
Dateioperationen nichts heißen: Denn die C-Funktion
aus der Standard-Bücherei von C wie fseek(3) oder fsetpos(3)
sehen jeweils andere Datentypen für Größen- bzw. Positionsangaben
vor: zum Beispiel long und fpos_t. Aber fpos_t muss nicht mal
unter der Haube ein Ganzzahltyp sein:

"Although fpos_t has traditionally been an integral type,
applications cannot assume that it is; in particular,
they must not perform arithmetic on objects of this type."
(BSD)

fpos_t hat also nach Definition gar nichts mit int zu tun.
Auch nicht mit long.

"On some non-UNIX systems an fpos_t object may be a complex object
and these routines may be the only way to portably reposition a
text stream." (GNU/Linux)

Demnach ist es nicht gut, wenn überhaupt möglich, ein Objekt
wie eine(n) Datei(zeiger) mit Werten zu manipulieren, deren Typ nicht
dafür vorgesehen ist: int ist nicht für Dateioperationen wie
ftell(3) vorgesehen, sondern long; fgetpos(3) bekommt
einen fpos_t.

Wirf das mal deinem compiler zu, vielleicht sagt das Ding was
zu den verwendeten Typen, vielleicht aber auch nicht:

int vorsicht;

vorsicht = ftell(...);

Ähnliche fragen