Vor long
nicht allzu langer Zeit hat mir jemand gesagt, dass es auf 64-Bit-Computern keine 64-Bit-Computer gibt, die ich immer verwenden sollte int
. Das ergab für mich keinen Sinn. Ich habe gesehen, dass Dokumente (wie die auf Apples offizieller Website) sagen, dass sie long
beim Kompilieren für eine 64-Bit-CPU tatsächlich 64 Bit sind. Ich habe nachgeschlagen, was es unter 64-Bit-Windows war, und festgestellt
- Windows:
long
undint
bleiben 32 Bit lang, und spezielle neue Datentypen werden für 64-Bit-Ganzzahlen definiert.
(von http://www.intel.com/cd/ids/developer/asmo-na/eng/197664.htm?page=2 )
Was soll ich verwenden? Soll ich so etwas wie definieren uw
, sw
((un) unterzeichnet Breite) als long
wenn sie nicht auf Windows, und ansonsten eine Überprüfung der Ziel - CPU Bitbreite tun?
sizeof(long) == 8
sogar unter Windows :-)size_t
oder einen Iteratortyp, um zu iterieren, nichtint
oderint64_t
size_t
es in der Nähe von negativen Zahlen schwierig wird, weilsize_t
es nicht signiert ist. Alsofor(size_t i=0; i<v.size()-2; i++)
schlägt für Vektorgröße 0 und 1 fehl. Ein weiteres Beispiel :for(size_t i=v.size()-1; i>=0; i--)
.size_t
Werten, sollte das Ergebnis in einer Variablen vomptrdiff_t
TypAntworten:
In der Unix-Welt gab es einige mögliche Anordnungen für die Größe von Ganzzahlen und Zeigern für 64-Bit-Plattformen. Die beiden am häufigsten verwendeten waren ILP64 (eigentlich nur sehr wenige Beispiele dafür; Cray war eines davon) und LP64 (für fast alles andere). Die Akronynmen stammen von 'int, long, Zeiger sind 64-Bit' und 'long, Zeiger sind 64-Bit'.
Das ILP64 System wurde zugunsten von verlassenen LP64 (das heißt, fast all später Teilnehmer verwendet LP64, basierend auf den Empfehlungen der Aspen - Gruppe, nur Systeme mit einer langen Tradition von 64-Bit - Betrieb ein anderes Schema verwenden). Alle modernen 64-Bit-Unix-Systeme verwenden LP64. MacOS X und Linux sind moderne 64-Bit-Systeme.
Microsoft verwendet ein anderes Schema für den Übergang zu 64-Bit: LLP64 ("lang lang, Zeiger sind 64-Bit"). Dies hat den Vorteil, dass 32-Bit-Software ohne Änderung neu kompiliert werden kann. Es hat den Nachteil, dass es sich von dem unterscheidet, was alle anderen tun, und es erfordert auch, dass der Code überarbeitet wird, um 64-Bit-Kapazitäten auszunutzen. Es war immer eine Überarbeitung notwendig; Es waren nur andere Revisionen als auf Unix-Plattformen.
Wenn Sie Ihre Software anhand plattformneutraler Ganzzahltypnamen entwerfen, verwenden Sie wahrscheinlich den C99-
<inttypes.h>
Header, der, wenn die Typen auf der Plattform verfügbar sind, signiert (aufgelistet) und nicht signiert (nicht aufgeführt; Präfix mit 'u') enthält:int8_t
- 8-Bit-Ganzzahlenint16_t
- 16-Bit-Ganzzahlenint32_t
- 32-Bit-Ganzzahlenint64_t
- 64-Bit-Ganzzahlenuintptr_t
- Ganzzahlen ohne Vorzeichen, die groß genug sind, um Zeiger aufzunehmenintmax_t
- größte Ganzzahl auf der Plattform (möglicherweise größer alsint64_t
)Sie können Ihre Anwendung dann mit diesen Typen codieren, wo es darauf ankommt, und mit Systemtypen (die möglicherweise unterschiedlich sind) sehr vorsichtig sein. Es gibt einen
intptr_t
Typ - einen vorzeichenbehafteten Ganzzahltyp zum Halten von Zeigern; Sie sollten planen, es nicht oder nur als Ergebnis einer Subtraktion von zweiuintptr_t
Werten zu verwenden (ptrdiff_t
).Wie die Frage zeigt (ungläubig), gibt es auf 64-Bit-Computern unterschiedliche Systeme für die Größe der ganzzahligen Datentypen. An etwas gewöhnen; Die Welt wird sich nicht ändern.
quelle
short
aufrufen, wie nennen Sie den 16-Bit-Typ? Und wenn Sie den 16-Bit-Typchar
für UTF-16 usw. aufrufen, wie nennen Sie den 8-Bit-Typ? Wenn Sie also LP64 verwenden, erhalten Sie 8-Bitchar
, 16-Bitshort
, 32-Bitint
, 64-Bitlong
und Raum für eine Aufwärtserweiterung auf 128-Bit,long long
wenn (falls?) Dies relevant wird. Danach haben Sie mehr Potenzen von 256 als Sie Namen in C haben (nun, ich nehme an, Sie könnten ein 256-Bit habenintmax_t
, und erst dann gehen Sie aus). LP64 hat seine Vorzüge.Es ist nicht klar, ob es sich um den Microsoft C ++ - Compiler oder die Windows-API handelt. Da es jedoch kein [c ++] - Tag gibt, gehe ich davon aus, dass es sich um die Windows-API handelt. Einige der Antworten haben unter Link Rot gelitten, daher biete ich noch einen Link an, der verrotten kann.
Weitere Informationen zu Windows - API - Typen wie
INT
,LONG
usw. gibt es eine Seite auf MSDN:Windows-Datentypen
Die Informationen sind auch in verschiedenen Windows-Header-Dateien wie verfügbar
WinDef.h
. Ich habe hier einige relevante Typen aufgelistet:Die Spalte "S / U" bezeichnet vorzeichenbehaftet / vorzeichenlos.
quelle
Dieser Artikel über MSDN verweist auf eine Reihe von Typ-Aliasen (verfügbar unter Windows), die in Bezug auf ihre Breite etwas expliziter sind:
http://msdn.microsoft.com/en-us/library/aa505945.aspx
Obwohl Sie ULONGLONG verwenden können, um auf einen 64-Bit-Integralwert ohne Vorzeichen zu verweisen, können Sie beispielsweise auch UINT64 verwenden. (Gleiches gilt für ULONG und UINT32.) Vielleicht werden diese etwas klarer?
quelle
int
und das letztere ein 32-Bit istlong
, würde gcc annehmen, dass ein Zeiger auf einen Typ den anderen trotz ihrer übereinstimmenden Darstellungen nicht als Alias verwenden kann].Microsoft hat auch UINT_PTR und INT_PTR für Ganzzahlen definiert, die dieselbe Größe wie ein Zeiger haben.
Hier ist eine Liste von Microsoft-spezifischen Typen - sie ist Teil ihrer Treiberreferenz, aber ich glaube, sie gilt auch für die allgemeine Programmierung.
quelle
Der einfachste Weg, es für Ihren Compiler / Ihre Plattform kennenzulernen:
Die Multiplikation mit 8 besteht darin, Bits aus Bytes zu erhalten.
Wenn Sie eine bestimmte Größe benötigen, ist es häufig am einfachsten, einen der vordefinierten Typen einer Bibliothek zu verwenden. Wenn dies unerwünscht ist, können Sie das tun, was häufig mit Autoconf-Software passiert, und das Konfigurationssystem den richtigen Typ für die erforderliche Größe bestimmen lassen.
quelle
Die Größe in Bit
long
auf Windows-Plattformen beträgt 32 Bit (4 Byte).Sie können dies mit überprüfen
sizeof(long)
.quelle
Wenn Sie Ganzzahlen bestimmter Länge verwenden müssen, sollten Sie wahrscheinlich einige plattformunabhängige Header verwenden, um Ihnen zu helfen. Boost ist ein guter Ort zum Anschauen.
quelle