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.