__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;
}
  

Vedere anche

Riferimenti

Modificatori Specifici microsoft