Partager via


Les nouveaux types de données

Il existe trois classes de nouveaux types de données : les types entiers à précision fixe, les types entiers de précision de pointeur et les types de pointeurs de précision spécifique. Ces types ont été ajoutés à l’environnement Windows (en particulier à Basetsd.h) pour permettre aux développeurs de se préparer à Windows 64 bits bien avant son introduction. Ces nouveaux types ont été dérivés de l’entier de base en langage C et des types longs, de sorte qu’ils fonctionnent dans le code existant. Par conséquent, utilisez ces types de données dans votre code maintenant, testez votre code sur Windows 32 bits et utilisez le compilateur 64 bits pour rechercher et résoudre les problèmes de portabilité à l’avance, afin que votre pilote puisse être prêt lorsque Windows 64 bits est disponible pour le test.

En outre, l’adoption de ces nouveaux types de données rendra votre code plus robuste. Pour utiliser ces types de données, vous devez analyser votre code à la recherche d’une utilisation de pointeur, d’un polymorphisme et de définitions de données potentiellement dangereux. Pour être sûr, utilisez les nouveaux types. Par exemple, lorsqu’une variable est de type ULONG_PTR, il est clair qu’elle sera utilisée pour le cast de pointeurs pour les opérations arithmétiques ou le polymorphisme. Il n’est pas possible d’indiquer une telle utilisation directement à l’aide des types de données Win32 natifs. Vous pouvez le faire à l’aide d’un nommage de type dérivé ou d’une notation hongroise, mais les deux techniques sont sujettes à des erreurs.

types entiers Fixed-Precision

Les types de données à précision fixe ont la même longueur pour la programmation 32 bits et 64 bits. Pour vous en souvenir, leur précision fait partie du nom du type de données. Voici les types de données de précision fixe.

Type Définition

DWORD32

Entier non signé 32 bits

DWORD64

Entier non signé 64 bits

INT32

Entier 32 bits signé

INT64

Entier 64 bits signé

LONG32

Entier 32 bits signé

LONG64

Entier 64 bits signé

UINT32

INT32 non signé

UINT64

INT64 non signé

ULONG32

LONG32 non signé

ULONG64

LONG64 non signé

types entiers Pointer-Precision

À mesure que la précision du pointeur change (c’est-à-dire qu’elle devient 32 bits lorsqu’elle est compilée pour les plateformes 32 bits, 64 bits lorsqu’elle est compilée pour les plateformes 64 bits), ces types de données reflètent la précision en conséquence. Par conséquent, il est sûr de convertir un pointeur vers l’un de ces types lors de l’exécution de l’arithmétique du pointeur ; si la précision du pointeur est de 64 bits, le type est 64 bits. Les types de nombre reflètent également la taille maximale à laquelle un pointeur peut faire référence. Voici les types de précision de pointeur et de nombre.

Type Définition

DWORD_PTR

Type long non signé pour la précision du pointeur.

HALF_PTR

Type intégral signé pour la précision des demi-pointeurs (16 bits sur les systèmes 32 bits, 32 bits sur les systèmes 64 bits).

INT_PTR

Type intégral signé pour la précision du pointeur.

LONG_PTR

Type long signé pour la précision du pointeur.

SIZE_T

Nombre maximal d’octets auxquels un pointeur peut faire référence. Utilisez ce type pour un nombre qui doit s’étendre sur toute la plage d’un pointeur.

SSIZE_T

SIZE_T signé.

UHALF_PTR

HALF_PTR non signé.

UINT_PTR

INT_PTR non signé.

ULONG_PTR

LONG_PTR non signé.

Fixed-Precision types de pointeurs

Il existe également de nouveaux types de pointeurs qui dimensionne explicitement le pointeur. Soyez prudent lorsque vous utilisez ces types de pointeurs dans du code 64 bits : si vous déclarez le pointeur à l’aide d’un type 32 bits, le système crée le pointeur en tronquant un pointeur 64 bits.

Type Définition

POINTER_32

Pointeur 32 bits. Sur un système 32 bits, il s’agit d’un pointeur natif. Sur un système 64 bits, il s’agit d’un pointeur 64 bits tronqué.

POINTER_64

Pointeur 64 bits. Sur un système 64 bits, il s’agit d’un pointeur natif. Sur un système 32 bits, il s’agit d’un pointeur 32 bits étendu aux signes.

Notez qu’il n’est pas sûr de supposer l’état du bit de pointeur élevé.

Fonctions d’assistance

Les fonctions inline suivantes (définies dans Basetsd.h) peuvent vous aider à convertir en toute sécurité des valeurs d’un type à un autre :

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 )

WarningIntToPtr sign-extends the int value, UIntToPtr zero-extends the unsigned int value, LongToPtr sign-extends the long value, and ULongToPtr zero-extends the unsigned long value.