__sptr, __uptr
Specyficzne dla firmy Microsoft
__sptr
Użyj modyfikatora lub __uptr
w deklaracji wskaźnika 32-bitowego, aby określić, jak kompilator konwertuje wskaźnik 32-bitowy na wskaźnik 64-bitowy. Wskaźnik 32-bitowy jest konwertowany, na przykład gdy jest przypisany do zmiennej wskaźnika 64-bitowego lub wyłuskany na platformie 64-bitowej.
Dokumentacja obsługi technicznej Microsoft dla 64-bitowych platform czasami dotyczy najważniejszego bitu wskaźnika 32-bitowego, jako bitu znaku. Domyślnie kompilator używa rozszerzenia znaku, aby konwertować wskaźnik 32-bitowy na wskaźnik 64-bitowy. Oznacza to, że najmniej znaczące 32 bity wskaźnika 64-bitowego są ustawione na wartość wskaźnika 32-bitowego i najbardziej znaczące 32 bity są ustawione na wartość bitu znaku wskaźnika 32-bitowego. Ta konwersja daje poprawne wyniki, jeśli bit znaku ma wartość 0, ale nie jeśli bitem znaku jest 1. Na przykład 32-bitowy adres 0x7FFFFFFF daje równoważny 64-bitowy adres 0x000000007FFFFFFF, ale 32-bitowy adres 0x80000000 zostanie niepoprawnie zmieniony na 0xFFFFFFFF80000000.
Modyfikator __sptr
, lub podpisany wskaźnik określa, że konwersja wskaźnika ustawić najbardziej znaczące bity wskaźnika 64-bitowego na bit znaku wskaźnika 32-bitowego. Modyfikator __uptr
, lub niepodpisany wskaźnik określa, że konwersja ustawia najbardziej znaczące bity na zero. Poniższe deklaracje pokazują __sptr
modyfikatory i __uptr
używane z dwoma niekwalifikowanymi wskaźnikami, dwa wskaźniki kwalifikowane za pomocą typu __ptr32 i parametr funkcji.
int * __sptr psp;
int * __uptr pup;
int * __ptr32 __sptr psp32;
int * __ptr32 __uptr pup32;
void MyFunction(char * __uptr __ptr32 myValue);
__sptr
Użyj modyfikatorów i __uptr
z deklaracjami wskaźników. Użyj modyfikatorów w pozycji kwalifikatora typu wskaźnika, co oznacza, że modyfikator musi podążać za gwiazdką. Nie można używać modyfikatorów ze wskaźnikami do elementów członkowskich. Modyfikatory nie wpływają na deklaracje niewskaźnikowe.
Aby uzyskać zgodność z poprzednimi wersjami, _sptr i _uptr są synonimami __sptr
i __uptr
chyba że określono opcję kompilatora /Za (Wyłącz rozszerzenia języka).
Przykład
Poniższy przykład deklaruje 32-bitowe wskaźniki używające __sptr
modyfikatorów i __uptr
przypisuje każdy wskaźnik 32-bitowy do zmiennej wskaźnika 64-bitowego, a następnie wyświetla wartość szesnastkową każdego wskaźnika 64-bitowego. Przykład jest kompilowany za pomocą natywnego 64-bitowego kompilatora i jest wykonywany na platformie 64-bitowej.
// sptr_uptr.cpp
// processor: x64
#include "stdio.h"
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;
}
Display each 32-bit pointer (as an unsigned 64-bit pointer):
p32d: 0000000087654321
p32s: 0000000087654321
p32u: 0000000087654321
Display the 64-bit pointer created from each 32-bit pointer:
p32d: p64 = FFFFFFFF87654321
p32s: p64 = FFFFFFFF87654321
p32u: p64 = 0000000087654321
END Microsoft Specific
Zobacz też
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla