__sptr、__uptr__sptr, __uptr

Microsoft 固有の仕様Microsoft Specific

使用して、 _ _sptrまたは _ _uptrコンパイラが 32 ビット ポインターを 64 ビット ポインターに変換する方法を指定する 32 ビット ポインターの宣言に修飾子。Use the __sptr or __uptr modifier on a 32-bit pointer declaration to specify how the compiler converts a 32-bit pointer to a 64-bit pointer. たとえば、32 ビット ポインターが 64 ビット ポインター変数に割り当てられたときや、64 ビット プラットフォーム上で 32 ビット ポインターが逆参照される場合などに変換が必要になります。A 32-bit pointer is converted, for example, when it is assigned to a 64-bit pointer variable or is dereferenced on a 64-bit platform.

64 ビット プラットフォームをサポートする Microsoft のドキュメントでは、32 ビット ポインターの最上位ビットを符号ビットと呼んでいる場合があります。Microsoft documentation for support of 64-bit platforms sometimes refers to the most significant bit of a 32-bit pointer as the sign bit. 既定では、コンパイラは符号拡張を使用して 32 ビット ポインターを 64 ビット ポインターに変換します。By default, the compiler uses sign extension to convert a 32-bit pointer to a 64-bit pointer. つまり、64 ビット ポインターの下位 32 ビットに 32 ビット ポインターの値が設定され、上位 32 ビットに 32 ビット ポインターの符号ビットの値が設定されます。That is, the least significant 32 bits of the 64-bit pointer are set to the value of the 32-bit pointer and the most significant 32 bits are set to the value of the sign bit of the 32-bit pointer. 符号ビットが 0 の場合はこの変換で正しい結果が得られますが、符号ビットが 1 の場合は正しい結果が得られません。This conversion yields correct results if the sign bit is 0, but not if the sign bit is 1. たとえば、32 ビット アドレス 0x7FFFFFFF はこれと同等の 64 ビットアドレス 0x000000007FFFFFFF になりますが、32 ビット アドレス 0x80000000 は誤って 0xFFFFFFFF80000000 に変換されます。For example, the 32-bit address 0x7FFFFFFF yields the equivalent 64-bit address 0x000000007FFFFFFF, but the 32-bit address 0x80000000 is incorrectly changed to 0xFFFFFFFF80000000.

_ _Sptr、符号付きポインター、または修飾子はポインター変換が 32 ビット ポインターの符号ビットに 64 ビット ポインターの最上位ビットを設定することを指定します。The __sptr, or signed pointer, modifier specifies that a pointer conversion set the most significant bits of a 64-bit pointer to the sign bit of the 32-bit pointer. _ _Uptr、または符号なしポインターは、修飾子を指定の変換に最上位ビットが 0 に設定されています。The __uptr, or unsigned pointer, modifier specifies that a conversion set the most significant bits to zero. 次の宣言に示す、 _ _sptr_ _uptr修飾されていない 2 つのポインターと共に使用する修飾子で修飾を 2 つのポインター、 _ _ptr32型、および関数パラメーター。The following declarations show the __sptr and __uptr modifiers used with two unqualified pointers, two pointers qualified with the __ptr32 type, and a function parameter.

int * __sptr psp;
int * __uptr pup;
int * __ptr32 __sptr psp32;
int * __ptr32 __uptr pup32;
void MyFunction(char * __uptr __ptr32 myValue);

使用して、 _ _sptr_ _uptrポインター宣言での修飾子。Use the __sptr and __uptr modifiers with pointer declarations. 位置で、修飾子を使用して、ポインター型修飾子、つまり、修飾子は、アスタリスクが従う必要があります。Use the modifiers in the position of a pointer type qualifier, which means the modifier must follow the asterisk. これらの修飾子を使用することはできませんメンバーへのポインターします。You cannot use the modifiers with pointers to members. これらの修飾子は、ポインター以外の宣言には影響を与えません。The modifiers do not affect non-pointer declarations.

以前のバージョンとの互換性のため _sptr_uptrのシノニムで _ _sptr_ _uptrコンパイラ オプション/Za(言語拡張機能を無効にする)を指定します。For compatibility with previous versions, _sptr and _uptr are synonyms for __sptr and __uptr unless compiler option /Za (Disable language extensions) is specified.

Example

次の例を使用して、32 ビット ポインターの宣言、 _ _sptr_ _uptr修飾子、各 32 ビット ポインターを 64 ビット ポインター変数に代入し、各 64 - の 16 進数の値が表示されますビットのポインター。The following example declares 32-bit pointers that use the __sptr and __uptr modifiers, assigns each 32-bit pointer to a 64-bit pointer variable, and then displays the hexadecimal value of each 64-bit pointer. この例はネイティブの 64 ビット コンパイラでコンパイルされ、64 ビット プラットフォームで実行されます。The example is compiled with the native 64-bit compiler and is executed on a 64-bit platform.

// 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 固有の仕様はここまでEND Microsoft Specific

関連項目See also

Microsoft 固有の修飾子Microsoft-Specific Modifiers