Wie char in int64 konvertieren?
-
Ich hab das Problem, dass ich einen Wert als string literal bekomme, der ungefähr so aussieht:
582760015711771
Nun benötige ich diesen wert in ein __int64 oder long long, atol konvertiert jedoch ja nur nach long (was für mich == int ist)
Gibt es da nen sauberen ansii weg?
-
1. Du willst einen String in eine Zahl konvertieren -> Titel ist falsch.
2. Grundsätzlich gäbe es sogar gar keine Möglichkeit.long longwie auch__int64sind nicht im Standard enthalten. Viele Compiler haben aber eine Unterstützung fürlong long. Aber wie gesagt, es ist nicht standardkonform.
3. Gibt es einen FAQ Beitrag zur Zahlenkonvertierung:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39488.html
4. Zu bevorzugen sind die C++ Stringstreams.#include <sstream> int main() { __int64 t; std::stringstream ss("546573468461"); ss >> t; return 0; }Grüssli
-
Ist es wahrscheinlicher, dass long long öfter unterstützt wird, als __int64?
Das Problem ist, es muss effizient sein und ich frage mich, ob boost da was schnelleres hat.
Diese Methode wird an die 5 Mil man benötigt...Btw: Danke
-
Seikilos schrieb:
Ist es wahrscheinlicher, dass long long öfter unterstützt wird, als __int64?
Selbst wenn, gehe ich mal davon aus das nicht sichergestellt ist das long long 64 Bit aufnimmt (sondern eher: int<=long<=long long).
Unter VC2008, C++ Builder 2007 und Windows XP 32 bekomme ich aber folgendes:
int 4 Byte, long 4 Byte, long long 8 Byte, __int64 8 Bytecu André
-
Seikilos schrieb:
Das Problem ist, es muss effizient sein und ich frage mich, ob boost da was schnelleres hat.
Diese Methode wird an die 5 Mil man benötigt...Boost verwenden den
boost::lexical_cast, welcher intern nichts anderes als ein Stringstream ist.Aber probier es mal aus und schaue später nach, ob es den Code wirklich verlangsamt. Optimieren sollte man danach und nicht davor. Erst am Ende kann man dank eines Profilers erkennen, wo die Problemstellen wirklich sind.
Grüssli
-
Seikilos schrieb:
Ist es wahrscheinlicher, dass long long öfter unterstützt wird, als __int64?
Wieso ist das wichtig? Mach ein typedef mit einem Kommentar, dass das plattform- sowie kompilerspezifisch ist. Eventuell mit einem static assert, dass der Typ ausreichend groß ist.
Gruß
Don06
-
Wenn Du Boost noch ausprobieren solltest: Natürlich bietet Boost auch für dieses Dilemma eine Lösung:
#include <boost/integer.hpp> typedef boost::int_t< 64 >::least my_int64_t;Fliegt auf die Nase, wenn die Plattform keinen Typen bereitstellt, der mindestens 64 Bit groß ist. Und bei den Konvertierungsoperatoren, die (z.B.) boost::lexical_cast benutzt, fliegt er auch auf die Nase, wenn Deine Standardbibliothek sie für diese Größe nicht anbietet.
-
Unter Microsoft Visual C++ sind
long long intund__int64identisch (sieht man, wenn man über einelong long-Variable mit dem Mauszeiger fährt).