WindowsではBaseTsd.h
には、POINTER_SIGNED
とPOINTER_UNSIGNED
の2つのマクロがあり、それぞれ__sptr
と__uptr
に解決されています。 According to Microsoft's documentationこれらは、コンパイラが32ビットポインタを64ビットポインタに変換する方法をと指定するディレクティブです。POINTER_SIGNEDまたはPOINTER_UNSIGNEDのケースを使用しますか?
__sptr
これは、ポインタを符号付きとして扱い、それを64ビットに変換するため、負のポインタが負として拡張されますが、これは誤って最上位ビットを符号ビットとして扱うことになりますこれは場合によっては望ましくないかもしれない。
したがって__uptr
が作成されました。この場合、ポインタは符号なしとして処理され、符号なしとして拡張されます。今、私はどのような状況がこのような構造を必要とするのかを理解することができず、どれが最も適しているのかを理解するのに困っています。
int
またはunsigned int
から64ビットプラットフォームの場合と同じようにポインタを逆参照する代わりに__ptr32を使用する利点は何ですか?どちらも一般的に未定義の振る舞いを呼び出すでしょう。 __sptr
と__uptr
の間でどのように選択するのですか?
現代のC++ 11コンパイラでは、これらのWin32移植性のタイプを実際に使用するべきではありません。 [ptrdiff_t](http://en.cppreference.com/w/cpp/types/ptrdiff_t)と[size_t](http://en.cppreference.com/w/cpp/types/size_t)を使用するだけで、 –