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 .