Nuovi tipi di dati
Sono disponibili tre classi di nuovi tipi di dati: tipi integer a precisione fissa, tipi integer di precisione del puntatore e tipi di puntatore a precisione specifici. Questi tipi sono stati aggiunti all'ambiente Windows (in particolare a Basetsd.h) per consentire agli sviluppatori di preparare Windows a 64 bit ben prima dell'introduzione. Questi nuovi tipi sono stati derivati dai tipi integer del linguaggio C di base e long, quindi funzionano nel codice esistente. Pertanto, usare questi tipi di dati nel codice ora, testare il codice in Windows a 32 bit e usare il compilatore a 64 bit per trovare e correggere in anticipo i problemi di portabilità, in modo che il driver possa essere pronto quando Windows a 64 bit è disponibile per i test.
Inoltre, l'adozione di questi nuovi tipi di dati renderà il codice più affidabile. Per usare questi tipi di dati, è necessario analizzare il codice per individuare l'utilizzo di puntatori potenzialmente non sicuri, il polimorfismo e le definizioni di dati. Per essere sicuri, usare i nuovi tipi. Ad esempio, quando una variabile è di tipo ULONG_PTR, è chiaro che verrà usata per il cast dei puntatori per operazioni aritmetiche o polimorfismo. Non è possibile indicare questo utilizzo direttamente usando i tipi di dati Win32 nativi. A tale scopo, è possibile usare la denominazione dei tipi derivati o la notazione ungherese, ma entrambe le tecniche sono soggette a errori.
tipi integer Fixed-Precision
I tipi di dati a precisione fissa hanno la stessa lunghezza per la programmazione a 32 bit e a 64 bit. Per ricordarlo, la precisione fa parte del nome del tipo di dati. Di seguito sono riportati i tipi di dati a precisione fissa.
Tipo | Definizione |
---|---|
DWORD32 |
Intero senza segno a 32 bit |
DWORD64 |
Intero senza segno a 64 bit |
INT32 |
Intero con segno a 32 bit |
INT64 |
Intero con segno a 64 bit |
LONG32 |
Intero con segno a 32 bit |
LONG64 |
Intero con segno a 64 bit |
UINT32 |
INT32 senza segno |
UINT64 |
INT64 senza segno |
ULONG32 |
LONG32 senza segno |
ULONG64 |
LONG64 senza segno |
tipi integer Pointer-Precision
Man mano che la precisione del puntatore cambia (ovvero diventa 32 bit quando viene compilata per le piattaforme a 32 bit, 64 bit durante la compilazione per le piattaforme a 64 bit), questi tipi di dati riflettono di conseguenza la precisione. Pertanto, è possibile eseguire il cast di un puntatore a uno di questi tipi quando si esegue l'aritmetica del puntatore; se la precisione del puntatore è a 64 bit, il tipo è a 64 bit. I tipi di conteggio riflettono anche le dimensioni massime a cui può fare riferimento un puntatore. Di seguito sono riportati i tipi di precisione e conteggio del puntatore.
Tipo | Definizione |
---|---|
DWORD_PTR |
Tipo long senza segno per la precisione del puntatore. |
HALF_PTR |
Tipo integrale con segno per la precisione a metà puntatore (16 bit nei sistemi a 32 bit, 32 bit nei sistemi a 64 bit). |
INT_PTR |
Tipo integrale con segno per la precisione del puntatore. |
LONG_PTR |
Tipo long con segno per la precisione del puntatore. |
SIZE_T |
Numero massimo di byte a cui può fare riferimento un puntatore. Usare questo tipo per un conteggio che deve estendersi all'intervallo completo di un puntatore. |
SSIZE_T |
SIZE_T firmato. |
UHALF_PTR |
HALF_PTR senza segno. |
UINT_PTR |
INT_PTR senza segno. |
ULONG_PTR |
LONG_PTR senza segno. |
Tipi di puntatore Fixed-Precision
Esistono anche nuovi tipi di puntatore che ridimensionano in modo esplicito il puntatore. Prestare attenzione quando si usano questi tipi di puntatore nel codice a 64 bit: se si dichiara il puntatore usando un tipo a 32 bit, il sistema crea il puntatore troncando un puntatore a 64 bit.
Tipo | Definizione |
---|---|
POINTER_32 |
Puntatore a 32 bit. In un sistema a 32 bit, si tratta di un puntatore nativo. In un sistema a 64 bit, si tratta di un puntatore a 64 bit troncato. |
POINTER_64 |
Puntatore a 64 bit. In un sistema a 64 bit, si tratta di un puntatore nativo. In un sistema a 32 bit, si tratta di un puntatore a 32 bit con estensione del segno. Si noti che non è sicuro presupporre lo stato del bit del puntatore elevato. |
Funzioni di supporto
Le funzioni inline seguenti (definite in Basetsd.h) consentono di convertire in modo sicuro i valori da un tipo a un altro:
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 )
AvvisoIntToPtr sign-estende il valore int , UIntToPtr zero estende il valore int senza segno, il segno LongToPtr estende il valore long e ULongToPtr zero estende il valore long senza segno .