Partilhar via


Os novos tipos de dados

Há três classes de novos tipos de dados: tipos inteiros de precisão fixa, tipos inteiros de precisão de ponteiro e tipos de ponteiro de precisão específica. Esses tipos foram adicionados ao ambiente do Windows (especificamente, ao Basetsd.h) para permitir que os desenvolvedores se preparem para o Windows de 64 bits bem antes de sua introdução. Esses novos tipos foram derivados do inteiro básico da linguagem C e dos tipos longos, portanto, funcionam no código existente. Portanto, use esses tipos de dados em seu código agora, teste seu código no Windows de 32 bits e use o compilador de 64 bits para localizar e corrigir problemas de portabilidade com antecedência, para que o driver possa estar pronto quando o Windows de 64 bits estiver disponível para teste.

Além disso, a adoção desses novos tipos de dados tornará seu código mais robusto. Para usar esses tipos de dados, você deve verificar seu código quanto ao uso potencialmente inseguro de ponteiro, polimorfismo e definições de dados. Para ser seguro, use os novos tipos. Por exemplo, quando uma variável é do tipo ULONG_PTR, fica claro que ela será usada para conversão de ponteiros para operações aritméticas ou polimorfismo. Não é possível indicar esse uso diretamente usando os tipos de dados nativos do Win32. Você pode fazer isso usando a nomenclatura de tipo derivado ou a notação húngara, mas ambas as técnicas são propensas a erros.

tipos inteiros Fixed-Precision

Os tipos de dados de precisão fixa têm o mesmo comprimento para programação de 32 bits e 64 bits. Para ajudá-lo a se lembrar disso, a precisão deles faz parte do nome do tipo de dados. Veja a seguir os tipos de dados de precisão fixa.

Digite Definição

DWORD32

Inteiro sem sinal de 32 bits

DWORD64

Inteiro sem sinal de 64 bits

INT32

Inteiro com sinal de 32 bits

INT64

Inteiro com sinal de 64 bits

LONG32

Inteiro com sinal de 32 bits

LONG64

Inteiro com sinal de 64 bits

UINT32

INT32 sem sinal

UINT64

INT64 sem sinal

ULONG32

LONG32 sem sinal

ULONG64

LONG64 sem sinal

tipos inteiros Pointer-Precision

À medida que a precisão do ponteiro muda (ou seja, à medida que se torna 32 bits quando compilado para plataformas de 32 bits, 64 bits quando compilado para plataformas de 64 bits), esses tipos de dados refletem a precisão adequadamente. Portanto, é seguro converter um ponteiro para um desses tipos ao executar a aritmética de ponteiro; se a precisão do ponteiro for de 64 bits, o tipo será de 64 bits. Os tipos de contagem também refletem o tamanho máximo ao qual um ponteiro pode se referir. Veja a seguir os tipos de precisão de ponteiro e contagem.

Digite Definição

DWORD_PTR

Tipo longo sem sinal para precisão de ponteiro.

HALF_PTR

Tipo integral assinado para precisão de meio ponteiro (16 bits em sistemas de 32 bits, 32 bits em sistemas de 64 bits).

INT_PTR

Tipo integral assinado para precisão do ponteiro.

LONG_PTR

Tipo longo assinado para precisão do ponteiro.

SIZE_T

O número máximo de bytes aos quais um ponteiro pode se referir. Use esse tipo para uma contagem que deve abranger o intervalo completo de um ponteiro.

SSIZE_T

SIZE_T assinado.

UHALF_PTR

HALF_PTR sem sinal.

UINT_PTR

INT_PTR sem sinal.

ULONG_PTR

LONG_PTR sem sinal.

Tipos de ponteiro Fixed-Precision

Também há novos tipos de ponteiro que dimensionam explicitamente o ponteiro. Tenha cuidado ao usar esses tipos de ponteiro em código de 64 bits: se você declarar o ponteiro usando um tipo de 32 bits, o sistema criará o ponteiro truncando um ponteiro de 64 bits.

Digite Definição

POINTER_32

Um ponteiro de 32 bits. Em um sistema de 32 bits, esse é um ponteiro nativo. Em um sistema de 64 bits, esse é um ponteiro truncado de 64 bits.

POINTER_64

Um ponteiro de 64 bits. Em um sistema de 64 bits, esse é um ponteiro nativo. Em um sistema de 32 bits, esse é um ponteiro de 32 bits estendido por sinal.

Observe que não é seguro assumir o estado do bit de ponteiro alto.

Funções auxiliares

As seguintes funções embutidas (definidas em Basetsd.h) podem ajudá-lo a converter valores com segurança de um tipo para outro:

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 )

AvisoIntToPtr 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.