Compartir a través de


Nuevos tipos de datos

Hay tres clases de nuevos tipos de datos: tipos enteros de precisión fija, tipos enteros de precisión de puntero y tipos de puntero de precisión específica. Estos tipos se agregaron al entorno de Windows (en concreto, a Basetsd.h) para permitir a los desarrolladores prepararse para Windows de 64 bits antes de su introducción. Estos nuevos tipos se derivaron del entero básico del lenguaje C y los tipos largos, por lo que funcionan en el código existente. Por lo tanto, use estos tipos de datos en el código ahora, pruebe el código en Windows de 32 bits y use el compilador de 64 bits para buscar y corregir problemas de portabilidad con antelación, por lo que el controlador puede estar listo cuando Windows de 64 bits está disponible para las pruebas.

Además, la adopción de estos nuevos tipos de datos hará que el código sea más sólido. Para usar estos tipos de datos, debe examinar el código para detectar el uso de punteros potencialmente no seguros, el polimorfismo y las definiciones de datos. Para ser seguro, use los nuevos tipos. Por ejemplo, cuando una variable es de tipo ULONG_PTR, está claro que se usará para convertir punteros para operaciones aritméticas o polimorfismo. No es posible indicar este uso directamente mediante los tipos de datos nativos de Win32. Puede hacerlo mediante la nomenclatura de tipos derivados o la notación húngaro, pero ambas técnicas son propensas a errores.

tipos enteros de Fixed-Precision

Los tipos de datos de precisión fija son la misma longitud para la programación de 32 y 64 bits. Para ayudarle a recordar esto, su precisión forma parte del nombre del tipo de datos. A continuación se muestran los tipos de datos de precisión fija.

Tipo Definición

DWORD32

Entero de 32 bits sin signo

DWORD64

Entero de 64 bits sin signo

INT32

Entero de 32 bits con signo

INT64

Entero de 64 bits con signo

LONG32

Entero de 32 bits con signo

LONG64

Entero de 64 bits con signo

UINT32

Unsigned INT32

UINT64

Unsigned INT64

ULONG32

LONG32 sin signo

ULONG64

Long64 sin signo

tipos enteros de Pointer-Precision

A medida que cambia la precisión del puntero (es decir, se convierte en 32 bits cuando se compila para plataformas de 32 bits, 64 bits cuando se compila para plataformas de 64 bits), estos tipos de datos reflejan la precisión en consecuencia. Por lo tanto, es seguro convertir un puntero a uno de estos tipos al realizar aritmética de puntero; si la precisión del puntero es de 64 bits, el tipo es de 64 bits. Los tipos de recuento también reflejan el tamaño máximo al que puede hacer referencia un puntero. A continuación se muestran los tipos de precisión de puntero y recuento.

Tipo Definición

DWORD_PTR

Tipo largo sin signo para la precisión del puntero.

HALF_PTR

Tipo entero firmado para precisión de medio puntero (16 bits en sistemas de 32 bits, 32 bits en sistemas de 64 bits).

INT_PTR

Tipo entero con signo para la precisión del puntero.

LONG_PTR

Tipo largo con signo para la precisión del puntero.

SIZE_T

Número máximo de bytes a los que puede hacer referencia un puntero. Use este tipo para un recuento que debe abarcar el intervalo completo de un puntero.

SSIZE_T

SIZE_T firmado.

UHALF_PTR

HALF_PTR sin signo.

UINT_PTR

INT_PTR sin signo.

ULONG_PTR

LONG_PTR sin signo.

tipos de puntero de Fixed-Precision

También hay nuevos tipos de puntero que dimensionen explícitamente el puntero. Tenga cuidado al usar estos tipos de puntero en código de 64 bits: si declara el puntero mediante un tipo de 32 bits, el sistema crea el puntero truncando un puntero de 64 bits.

Tipo Definición

POINTER_32

Puntero de 32 bits. En un sistema de 32 bits, se trata de un puntero nativo. En un sistema de 64 bits, se trata de un puntero de 64 bits truncado.

POINTER_64

Puntero de 64 bits. En un sistema de 64 bits, se trata de un puntero nativo. En un sistema de 32 bits, se trata de un puntero de 32 bits extendido de signo.

Tenga en cuenta que no es seguro asumir el estado del bit de puntero alto.

Funciones del asistente

Las siguientes funciones insertadas (definidas en Basetsd.h) pueden ayudarle a convertir valores de forma segura de un tipo a otro:

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 )

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