unsigned long long vs unsigned long(Portabilität Sicht)
Ich möchte in der Lage sein, große positive Ganzzahlen(8 Byte) in meinem Projekt, obwohl sizeof(unsigned long) Erträge 8 in meinem system, ich habe gelesen, dass in den meisten Systemen unsigned long ist nur 4 bytes, und ich beschloss, unsigned long long zu gehen, da es garantiert mindestens 8 Byte.
Je mehr ich es verwenden, obwohl ich sah, dass es nicht das super tragbare, beispielsweise in einigen Systemen(je nach compiler) printf Formate %anzeiiri, in einigen Formaten, die er bei %lld.
Mein code läuft nur im 64-bit-debian-Maschinen, in denen unsigned long 8 bytes. Portabilität ist nicht ein großes Problem. Ist es ein overkill zu verwenden, unsigned long Zeit unsigned long unter diesen Umständen gibt es andere Vorteile der Verwendung von unsigned long Zeit unsigned long?
uint64_t
? Es ist in <stdint.h>.
was ist der Vorteil der Verwendung es über unsigned long long?
Es hält Zusammenstellung, wenn Sie don ' T haben jede Art mit genau 64 bits während lange lange zusammen mehr geben. Beide sind in C++11, beide sind Häufig als Erweiterung vor, aber ich würde nicht überrascht sein, wenn man manchmal die Gegenwart und nicht die anderen. Wenn Sie es nicht haben, stdint.h ist einfacher zu emulieren (vorausgesetzt, dass die Art vorhanden ist), als lange, lange.
danke, ich werde nachdenken, es zu verwenden.
Eine Frage im Zusammenhang mit here.
InformationsquelleAutor erin c | 2012-05-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
unsigned long long
ist garantiert mindestens 64 bits, unabhängig von der Plattform. (Es gibt Plattformen, wo es mehr—ich weiß, der 72 bit und 96 bits—aber Sie sind selten, und ausgesprochen exotisch.)unsigned long
ist garantiert mindestens 32 bits. Wenn Sie mehr als 32 bits ist, würde ich empfehlenunsigned long long
.Bezug auf die Formatierung, mit
printf
verwenden, sollten Sie"%llu"
(da es nicht signiert ist);"%lld"
ist fürsigned long long
.Ist das nicht der "mindestens 64 bits" Garantie erst ab C++11?
Wenn Sie arbeiten auf einer Plattform, wo beide
long long
undlong
haben die gleiche Größe, der generierte code sollte identisch sein, so gibt es keinen Grund, nicht zu verwendenlong long
. Und wenn der compiler warnt, wenn die übergabe einesunsigned long long
zu einem"%llu"
, kann dies nur als ein Fehler. Die einzige Legale Art zu passieren, um"%llu"
istunsigned long long
; übergeben von einer anderen Art ist Undefiniertes Verhalten.Offiziell C++ nicht
long long
vor C++11. C90 haben, aber, und erforderlich es werden mindestens 64 bits. Microsoft verwendet__int64
für eine Weile (unter Berücksichtigunglong long
eine Unixism bis C90 machte es offiziell), aber unterstützt habenlong long
für eine lange Zeit jetzt. Und sogar pre-C90, die Unix-Plattformen, wolong long
alle Ihren Ursprung erforderlich es werden mindestens 64 bits.Vielen Dank nochmal, ich bin mit gcc-v 4.3.2, wie es aussieht, hat es Unterstützung für lange. Ok in diesem Fall werde ich weiterhin mit unsigned long long.
InformationsquelleAutor James Kanze
Wenn Sie brauchen, um sicherzustellen, dass Sie eine Feste Größe des integer-Wert, unabhängig von Plattform, die Sie nutzen könnten boost::Integer-Bibliothek (siehe hier). Sie könnten die Verwendung von boost::int64_t oder boost::uint64_t für unsigned Werte
InformationsquelleAutor Cătălin Pitiș
Können Sie dies tun, wenn Sie möchten, bleiben Sie lange und lange:
W. r.t. diese
printf()
ahnt nicht das format. Sie sagen, dass es das format.Wenn Sie wollen printf eine
uint64
definiert als in der oben genannten, machen Sie es wie diese:printf("%llu", (unsigned long long)some_uint64_value);
Können Sie
typedef unsigned long long ulonglong;
um die Besetzung leichter zu geben.Gibt es andere Möglichkeiten, das gleiche zu tun, aber nicht alle Compiler unterstützen. Deshalb befestigte ich die
ULL
suffix an die Reihe. In einigen Kompatibilitäts-Modi, in-zwischen C89 und C99, 0xFFFFFFFFFFFFFFFF kann interpretiert werden als eineunsigned long
, nichtunsigned long long
ist, und wird abgeschnitten. Die neueste gcc standardmäßig läuft ingnu89
- Modus für C-code, nichtc99
oder höher.InformationsquelleAutor Alexey Frunze