Die neuen Datentypen

Es gibt drei Klassen neuer Datentypen: Ganzzahltypen mit fester Genauigkeit, Ganzzahltypen mit Zeigergenauigkeit und Zeigertypen mit bestimmter Genauigkeit. Diese Typen wurden der Windows-Umgebung (insbesondere basetsd.h) hinzugefügt, damit Entwickler sich bereits vor der Einführung auf 64-Bit-Windows vorbereiten können. Diese neuen Typen wurden von der einfachen ganzzahligen C-Sprache und den long-Typen abgeleitet, sodass sie in vorhandenem Code funktionieren. Verwenden Sie daher diese Datentypen jetzt in Ihrem Code, testen Sie Ihren Code unter 32-Bit-Windows, und verwenden Sie den 64-Bit-Compiler, um Portabilitätsprobleme im Voraus zu finden und zu beheben, damit Ihr Treiber bereit ist, wenn 64-Bit-Windows für Tests verfügbar ist.

Darüber hinaus wird Ihr Code durch die Einführung dieser neuen Datentypen robuster. Um diese Datentypen verwenden zu können, müssen Sie Ihren Code auf potenziell unsichere Zeigerverwendung, Polymorphie und Datendefinitionen überprüfen. Um sicher zu sein, verwenden Sie die neuen Typen. Wenn eine Variable beispielsweise vom Typ ULONG_PTR ist, ist es klar, dass sie zum Umwandeln von Zeigern für arithmetische Operationen oder Polymorphismus verwendet wird. Eine solche Verwendung kann nicht direkt mithilfe der nativen Win32-Datentypen angegeben werden. Sie können dazu abgeleitete Typennamen oder ungarische Notation verwenden, aber beide Techniken sind fehleranfällig.

Fixed-Precision Ganzzahltypen

Datentypen mit fester Genauigkeit haben die gleiche Länge für die 32-Bit- und 64-Bit-Programmierung. Damit Sie sich dies merken können, ist ihre Genauigkeit Teil des Namens des Datentyps. Im Folgenden sind die Datentypen mit fester Genauigkeit aufgeführt.

Typ Definition

DWORD32

32-Bit-Ganzzahl ohne Vorzeichen

DWORD64

64-Bit-Ganzzahl ohne Vorzeichen

INT32

32-Bit-Ganzzahl mit Vorzeichen

INT64

64-Bit-Ganzzahl mit Vorzeichen

LONG32

32-Bit-Ganzzahl mit Vorzeichen

LONG64

64-Bit-Ganzzahl mit Vorzeichen

UINT32

Unsigned INT32

UINT64

Unsigned INT64

ULONG32

Long32 ohne Vorzeichen

ULONG64

LONG64 ohne Vorzeichen

Pointer-Precision Ganzzahltypen

Wenn sich die Zeigergenauigkeit ändert (d. h., wenn sie bei der Kompilierung für 32-Bit-Plattformen zu 32 Bits und bei der Kompilierung für 64-Bit-Plattformen zu 64 Bits führt), spiegeln diese Datentypen die entsprechende Genauigkeit wider. Daher ist es sicher, einen Zeiger auf einen dieser Typen zu umwandeln, wenn Zeigerarithmetik ausgeführt wird. Wenn die Zeigergenauigkeit 64 Bit beträgt, beträgt der Typ 64 Bit. Die Anzahltypen geben auch die maximale Größe an, auf die ein Zeiger verweisen kann. Im Folgenden sind die Zeigergenauigkeits- und Count-Typen aufgeführt.

Typ Definition

DWORD_PTR

Unsigned long type for pointer precision.

HALF_PTR

Ganzzahliger Typ mit Vorzeichen für halbzeigere Genauigkeit (16 Bits auf 32-Bit-Systemen, 32 Bits auf 64-Bit-Systemen).

INT_PTR

Ganzzahliger Typ mit Vorzeichen für Zeigergenauigkeit.

LONG_PTR

Signierter long-Typ für Zeigergenauigkeit.

SIZE_T

Die maximale Anzahl von Bytes, auf die ein Zeiger verweisen kann. Verwenden Sie diesen Typ für eine Anzahl, die den gesamten Bereich eines Zeigers umfassen muss.

SSIZE_T

Signierte SIZE_T.

UHALF_PTR

Nicht signierte HALF_PTR.

UINT_PTR

Nicht signierter INT_PTR.

ULONG_PTR

Nicht signierte LONG_PTR.

Fixed-Precision Zeigertypen

Es gibt auch neue Zeigertypen, die den Zeiger explizit vergrößern. Seien Sie vorsichtig, wenn Sie diese Zeigertypen in 64-Bit-Code verwenden: Wenn Sie den Zeiger mit einem 32-Bit-Typ deklarieren, erstellt das System den Zeiger, indem es einen 64-Bit-Zeiger abschneidet.

Typ Definition

POINTER_32

Ein 32-Bit-Zeiger. Auf einem 32-Bit-System ist dies ein nativer Zeiger. Auf einem 64-Bit-System ist dies ein abgeschnittener 64-Bit-Zeiger.

POINTER_64

Ein 64-Bit-Zeiger. Auf einem 64-Bit-System ist dies ein nativer Zeiger. Auf einem 32-Bit-System ist dies ein 32-Bit-Zeiger mit erweitertem Vorzeichen.

Beachten Sie, dass es nicht sicher ist, den Zustand des HighPointer-Bits anzunehmen.

Hilfsfunktionen

Die folgenden Inlinefunktionen (definiert in Basetsd.h) können Ihnen helfen, Werte sicher von einem Typ in einen anderen zu konvertieren:

unsigned long HandleToUlong( const void *h )
long HandleToLong( const void *h )
void * LongToHandle( const long h )
unsigned long PtrToUlong( const void *p )
unsigned int PtrToUint( const void *p )
unsigned short PtrToUshort( const void *p )
long PtrToLong( const void *p )
int PtrToInt( const void *p )
short PtrToShort( const void *p )
void * IntToPtr( const int i )
void * UIntToPtr( const unsigned int ui )
void * LongToPtr( const long l )
void * ULongToPtr( const unsigned long ul )

WarnungIntToPtr-Sign-erweitert den int-Wert , UIntToPtr zero-erweitert den unsigned int-Wert , LongToPtr-Zeichen erweitert den long-Wert und ULongToPtr 0-erweitert den wert ohne Vorzeichen .