__sptr, __uptr
Microsoft 전용
컴파일러가 __sptr
32비트 포인터를 64비트 포인터로 변환하는 방법을 지정하려면 32비트 포인터 선언의 한 __uptr
정자를 사용합니다. 예를 들어 32비트 포인터는 64비트 포인터 변수에 할당되거나 64비트 플랫폼에서 역참조될 때 변환됩니다.
64비트 플랫폼 지원에 대한 Microsoft 설명서에서는 경우에 따라 32비트 포인터의 최상위 비트를 부호 비트로 지칭합니다. 기본적으로 컴파일러는 부호 확장을 사용하여 32비트 포인터를 64비트 포인터로 변환합니다. 즉, 64비트 포인터의 최하위 32비트는 32비트 포인터의 값으로 설정되며 최상위 32비트는 32비트 포인터의 부호 비트 값으로 설정됩니다. 이 변환은 부호 비트가 0인 경우 올바른 결과를 생성하지만 부호 비트가 1인 경우에는 올바른 결과를 생성하지 않습니다. 예를 들어 32비트 주소 0x7FFFFFFF는 동일한 64비트 주소 0x000000007FFFFFFF를 생성하지만 32비트 주소 0x80000000은 0xFFFFFFFF80000000으로 올바르지 않게 변경됩니다.
__sptr
또는 부호 있는 포인터 한정자는 포인터 변환이 64비트 포인터의 가장 중요한 비트를 32비트 포인터의 부호 비트로 설정하도록 지정합니다. __uptr
부호 없는 포인터인 한정자는 변환이 가장 중요한 비트를 0으로 설정하도록 지정합니다. 다음 선언에서는 정규화되지 않은 포인터 2개, __uptr
__ptr32 형식으로 정규화된 포인터 2개 및 함수 매개 변수와 함께 사용되는 한정자를 보여 __sptr
줍니다.
int * __sptr psp;
int * __uptr pup;
int * __ptr32 __sptr psp32;
int * __ptr32 __uptr pup32;
void MyFunction(char * __uptr __ptr32 myValue);
__sptr
포인터 선언과 함께 한 __uptr
정자를 사용합니다. 포인터 형식 한정자의 위치에 한정자를 사용합니다. 즉, 한정자가 별표 뒤에 있어야 합니다. 멤버에 대한 포인터와 함께 한정자를 사용할 수 없습니다. 한정자는 포인터 선언이 아닌 선언에 영향을 주지 않습니다.
이전 버전과의 호환성을 위해 컴파일러 옵션 /Za(언어 확장 사용 안 함)를 지정하지 않는 한 _sptr 및 __uptr
_uptr 동의어 __sptr
입니다.
예시
다음 예제에서는 한정자를 사용하는 __sptr
32비트 포인터를 선언하고 __uptr
각 32비트 포인터를 64비트 포인터 변수에 할당한 다음 각 64비트 포인터의 16진수 값을 표시합니다. 이 예제는 네이티브 64비트 컴파일러로 컴파일되며 64비트 플랫폼에서 실행됩니다.
// 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
Microsoft 전용 종료
참고 항목
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기