__sptr, __uptr
Specifici di Microsoft
utilizzare __sptr o __uptr modificatore in una dichiarazione di puntatore a 32 bit per specificare come il compilatore converte un puntatore a 32 bit a un puntatore a 64 bit.Un puntatore a 32 bit viene convertito, ad esempio, quando viene assegnato a una variabile puntatore a 64 bit o è derefenziato su una piattaforma a 64 bit.
La documentazione di Microsoft per supportare le piattaforme a 64 bit talvolta si riferisce al bit più significativi di un puntatore a 32 bit come il bit di segno.Per impostazione predefinita, il compilatore utilizza l'estensione del segno per convertire un puntatore a 32 bit a un puntatore a 64 bit.Ovvero quelli meno 32 bit significativi del puntatore a 64 bit vengono impostate sul valore del puntatore a 32 bit e a 32 bit più significativi vengono impostate sul valore di bit del segno del puntatore a 32 bit.Questa conversione dai risultati corretti se il bit di segno è 0, ma non se il bit di segno è 1.Ad esempio, l'indirizzo 0x7FFFFFFF a 32 bit rende l'indirizzo equivalente 0x000000007FFFFFFF a 64 bit, ma l'indirizzo 0x80000000 a 32 bit viene modificato in modo errato a 0xFFFFFFFF80000000.
__sptr, o il puntatore con segno, modificatore specifica che una conversione del puntatore imposta i bit più significativi di un puntatore a 64 bit per bit del segno del puntatore a 32 bit.__uptr, o il puntatore senza segno, modificatore specifica che una conversione imposta i bit più significativi su zero.Le dichiarazioni seguenti mostrano __sptr e __uptr i modificatori utilizzati con due puntatori non qualificati, due puntatori sono qualificati con __ptr32 tipo e un parametro di funzione.
int * __sptr psp;
int * __uptr pup;
int * __ptr32 __sptr psp32;
int * __ptr32 __uptr pup32;
void MyFunction(char * __uptr __ptr32 myValue);
utilizzare __sptr e __uptr modificatori con dichiarazioni del puntatore.Utilizzare i modificatori nella posizione di un oggetto qualificatore di tipo di puntatore, ovvero il modificatore necessario seguire l'asterisco.Non è possibile utilizzare i modificatori a puntatori ai membri.I modificatori non influiscono sulle dichiarazioni di tipo non puntatore.
Se non si utilizzano __sptr o __uptr il modificatore e si abilitano Avviso del compilatore (livello 2) C4826, il compilatore genera un avviso quando un puntatore a 32 bit convertito a 64 bit.
Esempio
Nell'esempio seguente viene dichiarata i puntatori a 32 bit che utilizzano __sptr e __uptr i modificatori, assegnare ciascun puntatore a 32 bit a una variabile puntatore a 64 bit quindi visualizzare il valore esadecimale di ogni puntatore a 64 bit.L'esempio viene compilato con il compilatore nativo a 64 bit ed eseguito su una piattaforma a 64 bit.
// sptr_uptr.cpp
// processor: x64
#include "stdio.h"
// Warning C4826 is off by default.
int main()
{
void * __ptr64 p64;
void * __ptr32 p32d; //default signed pointer
void * __sptr __ptr32 p32s; //explicit signed pointer
void * __uptr __ptr32 p32u; //explicit unsigned pointer
// Set the 32-bit pointers to a value whose sign bit is 1.
p32d = reinterpret_cast<void *>(0x87654321);
p32s = p32d;
p32u = p32d;
// The printf() function automatically displays leading zeroes with each 32-bit pointer. These are unrelated
// to the __sptr and __uptr modifiers.
printf("Display each 32-bit pointer (as an unsigned 64-bit pointer):\n");
printf("p32d: %p\n", p32d);
printf("p32s: %p\n", p32s);
printf("p32u: %p\n", p32u);
printf("\nDisplay the 64-bit pointer created from each 32-bit pointer:\n");
p64 = p32d;
printf("p32d: p64 = %p\n", p64);
p64 = p32s;
printf("p32s: p64 = %p\n", p64);
p64 = p32u;
printf("p32u: p64 = %p\n", p64);
return 0;
}