Condividi tramite


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 .