Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Det finns tre klasser med nya datatyper: heltalstyper med fast precision, heltalstyper med pekarprecision och specifika typer av precisionspekare. Dessa typer har lagts till i Windows-miljön (specifikt till Basetsd.h) så att utvecklare kan förbereda sig för 64-bitars Windows långt före introduktionen. Dessa nya typer härleddes från de grundläggande C-språk heltal och långa typerna, så de fungerar i befintlig kod. Använd därför dessa datatyper i koden nu, testa koden i 32-bitars Windows och använd 64-bitars kompilatorn för att hitta och åtgärda portabilitetsproblem i förväg, så att drivrutinen kan vara redo när 64-bitars Windows är tillgängligt för testning.
Om du antar dessa nya datatyper blir koden dessutom mer robust. Om du vill använda dessa datatyper måste du genomsöka koden efter potentiellt osäker pekaranvändning, polymorfism och datadefinitioner. Använd de nya typerna för att vara säker. När en variabel till exempel är av typen ULONG_PTR är det tydligt att den kommer att användas för typkonvertering av pekare i beräkningar eller för polymorfism. Det går inte att ange sådan användning direkt med hjälp av de interna Win32-datatyperna. Du kan göra detta med hjälp av namngivning av härledd typ eller ungersk notation, men båda teknikerna är benägna att fel.
Fixed-Precision Heltalstyper
Datatyper med fast precision är samma längd för 32-bitars och 64-bitars programmering. För att hjälpa dig att komma ihåg detta är deras precision en del av namnet på datatypen. Följande är datatyperna med fast precision.
| Typ | Definition |
|---|---|
DWORD32 |
32-bit osignerat heltal |
DWORD64 |
64-bit osignerat heltal |
INT32 |
32-bitars signerat heltal |
INT64 |
64-bit signerat heltal |
LONG32 |
32-bitars signerat heltal |
LONG64 |
64-bit signerat heltal |
UINT32 |
Osignerad INT32 |
UINT64 |
Osignerad INT64 |
ULONG32 |
Osignerad LONG32 |
ULONG64 |
Osignerad LONG64 |
Pointer-Precision heltalstyper
När pekarens precision ändras (dvs. när den blir 32 bitar när den kompileras för 32-bitarsplattformar, 64 bitar när den kompileras för 64-bitarsplattformar) återspeglar dessa datatyper precisionen i enlighet med detta. Därför är det säkert att konvertera en pekare till någon av dessa typer när du utför pekararitmetik. Om pekarens precision är 64 bitar är typen då 64 bitar. Antalstyperna återspeglar också den maximala storlek som en pekare kan referera till. Följande är typerna pekarprecision och antal.
| Typ | Definition |
|---|---|
DWORD_PTR |
Osignerad lång typ för pekarprecision. |
HALF_PTR |
Signerad integraltyp för halvpekarprecision (16 bitar på 32-bitarssystem, 32 bitar på 64-bitarssystem). |
INT_PTR |
Signerad integraltyp för pekarprecision. |
LONG_PTR |
Signerad lång typ för pekarprecision. |
SIZE_T |
Det maximala antalet byte som en pekare kan referera till. Använd den här typen för ett antal som måste sträcka sig över hela intervallet för en pekare. |
SSIZE_T |
Signerad SIZE_T. |
UHALF_PTR |
Osignerade HALF_PTR. |
UINT_PTR |
Osignerade INT_PTR. |
ULONG_PTR |
Osignerad LONG_PTR. |
Fixed-Precision pekartyper
Det finns också nya pekartyper som uttryckligen storleksanpassar pekaren. Var försiktig när du använder dessa pekartyper i 64-bitarskod: Om du deklarerar pekaren med en 32-bitarstyp skapar systemet pekaren genom att trunkera en 64-bitars pekare.
| Typ | Definition |
|---|---|
POINTER_32 |
En 32-bitars pekare. I ett 32-bitarssystem är detta en inbyggd pekare. I ett 64-bitarssystem är detta en trunkerad 64-bitars pekare. |
POINTER_64 |
En 64-bitars pekare. I ett 64-bitarssystem är detta en inbyggd pekare. I ett 32-bitarssystem är detta en sign-extended 32-bitars pekare. Observera att det inte är säkert att anta tillståndet för högpekarbiten. |
Hjälpfunktioner
Följande infogade funktioner (definierade i Basetsd.h) kan hjälpa dig att konvertera värden från en typ till en annan på ett säkert sätt:
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 )
VarningIntToPtr teckentillägger int-värdet, UIntToPtr nolltillägger det osignerade int-värdet, LongToPtr teckentillägger long-värdet och ULongToPtr nolltillägger det osignerade long-värdet.