it-swarm.com.de

Was ist die Bitgröße von Long unter 64-Bit-Windows?

Vor nicht allzu langer Zeit hat mir jemand gesagt, dass long keine 64-Bit-Maschinen sind und ich immer int verwenden sollte. Das ergab für mich keinen Sinn. Ich habe gesehen, dass Dokumente (wie die auf Apples offizieller Website) besagen, dass long tatsächlich 64 Bit sind, wenn für eine 64-Bit-CPU kompiliert wird. Ich habe nachgeschlagen, was es auf 64-Bit-Windows war und gefunden

  • Windows: long und int bleiben 32 Bit lang, und für 64-Bit-Ganzzahlen werden spezielle neue Datentypen definiert.

(von http://www.intel.com/cd/ids/developer/asmo-na/eng/197664.htm?page=2 )

Was soll ich benutzen? Sollte ich etwas wie uw, sw ((nicht) vorzeichenbehaftete Breite) als long definieren, wenn nicht unter Windows, und andernfalls die Bitgröße der Ziel-CPU überprüfen?

130
user34537

In der Unix-Welt gab es einige mögliche Anordnungen für die Größen von Ganzzahlen und Zeigern für 64-Bit-Plattformen. Die beiden am häufigsten verwendeten waren ILP64 (eigentlich nur einige Beispiele dafür; Cray war eines davon) und LP64 (für fast alles andere). Die Abkürzungen lauten 'int, long, Pointer sind 64-Bit' und 'long, Pointer sind 64-Bit'.

Type           ILP64   LP64   LLP64
char              8      8       8
short            16     16      16
int              64     32      32
long             64     64      32
long long        64     64      64
pointer          64     64      64

Das ILP64-System wurde zugunsten von LP64 aufgegeben (das heißt, fast alle späteren Teilnehmer verwendeten LP64, basierend auf den Empfehlungen der Aspen-Gruppe; nur Systeme mit einer langen Tradition von 64-Bit-Operationen verwenden ein anderes planen). 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 ('long long, Pointer 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 muss auch der Code überarbeitet werden, um 64-Bit-Kapazitäten auszunutzen. Es war immer eine Überarbeitung notwendig; Es handelte sich lediglich um eine andere Version als auf Unix-Plattformen.

Wenn Sie Ihre Software nach plattformneutralen Ganzzahl-Typnamen entwerfen, verwenden Sie wahrscheinlich den Header C99 <inttypes.h>, Der, wenn die Typen auf der Plattform verfügbar sind, in vorzeichenbehafteten (gelisteten) und vorzeichenlosen (nicht gelisteten) Präfixen zur Verfügung steht mit dir'):

  • int8_t - 8-Bit-Ganzzahlen
  • int16_t - 16-Bit-Ganzzahlen
  • int32_t - 32-Bit-Ganzzahlen
  • int64_t - 64-Bit-Ganzzahlen
  • uintptr_t - Ganzzahlen ohne Vorzeichen, die groß genug sind, um Zeiger aufzunehmen
  • intmax_t - Größte Ganzzahl auf der Plattform (möglicherweise größer als int64_t)

Sie können dann Ihre Anwendung mit diesen Typen codieren, sofern dies von Bedeutung ist, und sehr vorsichtig mit Systemtypen umgehen (die möglicherweise unterschiedlich sind). Es gibt einen Typ intptr_t - einen vorzeichenbehafteten Integer-Typ zum Halten von Zeigern; Sie sollten planen, es nicht oder nur als Ergebnis einer Subtraktion von zwei uintptr_t - Werten (ptrdiff_t) zu verwenden.

Wie die Frage jedoch (ungläubig) zeigt, gibt es unterschiedliche Systeme für die Größe der Ganzzahldatentypen auf 64-Bit-Computern. An etwas gewöhnen; Die Welt wird sich nicht ändern.

244

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 stelle ich einen weiteren Link zur Verfügung, der verrotten kann.


Informationen zu Windows-API-Typen wie INT, LONG usw. finden Sie auf einer Seite in MSDN:

Windows-Datentypen

Die Informationen sind auch in verschiedenen Windows-Header-Dateien wie WinDef.h Verfügbar. Ich habe hier einige relevante Typen aufgelistet:

 Typ | S/U | x86 | x64 
 ---------------------------- + ----- + -------- + ------- 
 BYTE, BOOLEAN | U | 8 bit | 8 Bit 
 ---------------------------- + ----- + -------- + ------- 
 KURZ | S | 16 bit | 16 Bit 
 USHORT, Word | U | 16 bit | 16 Bit 
 ---------------------------- + ----- + -------- + ------- 
 INT, LONG | S | 32 bit | 32 Bit 
 UINT, ULONG, DWORD | U | 32 bit | 32 Bit 
 ---------------------------- + ----- + -------- + ------- 
 INT_PTR, LONG_PTR, LPARAM | S | 32 bit | 64 Bit 
 UINT_PTR, ULONG_PTR, WPARAM | U | 32 bit | 64 Bit 
 ---------------------------- + ----- + -------- + ------- 
 LANG | S | 64 bit | 64 bit 
 ULONGLONG, QWORD | U | 64 bit | 64 Bit 

Die Spalte "S/U" steht für vorzeichenbehaftet/nicht vorzeichenbehaftet.

50

Dieser Artikel über MSDN verweist auf eine Reihe von Typaliasen (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?

4
reuben

Microsoft hat außerdem UINT_PTR und INT_PTR für Ganzzahlen definiert, die die gleiche Größe wie ein Zeiger haben.

Hier ist ein Liste der Microsoft-spezifischen Typen - es ist Teil ihrer Treiberreferenz, aber ich glaube, es gilt auch für die allgemeine Programmierung.

4
Mark Ransom

Am einfachsten lernen Sie es für Ihren Compiler/Ihre Plattform kennen:

#include <iostream>

int main() {
  std::cout << sizeof(long)*8 << std::endl;
}

Die Multiplikation mit 8 ergibt Bits aus Bytes.

Wenn Sie eine bestimmte Größe benötigen, ist es häufig am einfachsten, einen der vordefinierten Bibliothekstypen zu verwenden. Wenn dies nicht erwünscht ist, können Sie das tun, was häufig mit der Autoconf-Software geschieht, und das Konfigurationssystem den richtigen Typ für die benötigte Größe bestimmen lassen.

2
Paul de Vrieze

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.

0
PolyThinker