新しいデータ型
新しいデータ型には、固定精度整数型、ポインター精度整数型、および特定精度ポインター型の 3 つのクラスがあります。 これらの型が Windows 環境 (具体的には Basetsd.h) に追加されたことで、開発者は導入前に 64 ビット Windows を準備できるようになりました。 これらの新しい型は、基本的な C 言語整数と long 型から派生しているため、既存のコードで動作します。 そのため、これらのデータ型を今すぐコードに使用し、32 ビット Windows 上でコードをテストし、64 ビットコンパイラを使用して移植性の問題を事前に見つけて修正することで、64 ビット Windows がテスト可能になったときにドライバーを準備することができます。
さらに、これらの新しいデータ型を採用することで、コードの堅牢性が高まります。 これらのデータ型を使用するには、コードをスキャンして、安全でない可能性のあるポインターの使用、ポリモーフィズム、およびデータ定義を探す必要があります。 安全性を確保するため、新しい型の使用をお勧めします。 たとえば、変数が ULONG_PTR 型の場合、算術演算またはポリモーフィズムのポインターのキャストに使用されることは明らかです。 ネイティブの Win32 データ型を使用して、このような使用法を直接示すことはできません。 これを行うには、派生型の名前付けまたはハンガリー表記法を使用しますが、どちらの手法もエラーが発生しやすくなります。
固定精度整数型
固定精度データ型は、32 ビット プログラミングと 64 ビット プログラミングで同じ長さになります。 これを覚えておくために、精度はデータ型の名前の一部になっています。 固定精度データ型は次のとおりです。
Type | Definition |
---|---|
DWORD32 |
32 ビット符号なし整数 |
DWORD64 |
64 ビット符号なし整数 |
INT32 |
32 ビット符号付き整数 |
INT64 |
64 ビット符号付き整数 |
LONG32 |
32 ビット符号付き整数 |
LONG64 |
64 ビット符号付き整数 |
UINT32 |
符号なし INT32 |
UINT64 |
符号なし INT64 |
ULONG32 |
符号なし LONG32 |
ULONG64 |
符号なし LONG64 |
ポインター精度整数型
ポインターの精度が変化すると (つまり、32 ビット プラットフォーム用にコンパイルされると 32 ビットになり、64 ビット プラットフォーム用にコンパイルされた場合は 64 ビット)、これらのデータ型はそれに応じて精度を反映します。 したがって、ポインターの算術演算を実行するときに、これらの型のいずれかにポインターをキャストすることは安全です。ポインター精度が 64 ビットの場合、型は 64 ビットです。 カウント型には、ポインターが参照できる最大サイズも反映されます。 ポインター精度型とカウント型は次のとおりです。
Type | Definition |
---|---|
DWORD_PTR |
ポインター精度の符号なし long 型。 |
HALF_PTR |
半ポインター精度の符号付き整数型 (32 ビット システムでは 16 ビット、64 ビット システムでは 32 ビット)。 |
INT_PTR |
ポインターの有効桁数の符号付き整数型。 |
LONG_PTR |
ポインター精度の符号あり long 型。 |
SIZE_T |
ポインターが参照できる最大バイト数。 ポインターの全範囲にまたがる必要があるカウントには、この型を使用します。 |
SSIZE_T |
署名された SIZE_T。 |
UHALF_PTR |
符号なし HALF_PTR。 |
UINT_PTR |
符号なし INT_PTR。 |
ULONG_PTR |
符号なし LONG_PTR。 |
固定精度ポインター型
ポインターのサイズを明示的に設定する新しいポインター型もあります。 64 ビット コードでこれらのポインター型を使用する場合は注意してください。32 ビット型を使用してポインターを宣言すると、64 ビット ポインターを切り捨てることによってポインターが作成されます。
Type | Definition |
---|---|
POINTER_32 |
32 ビット ポインター。 32 ビット システムでは、これはネイティブ ポインターです。 64 ビット システムでは、これは切り捨てられた 64 ビット ポインターです。 |
POINTER_64 |
64 ビット ポインター。 64 ビット システムでは、これはネイティブ ポインターです。 32 ビット システムでは、これは符号拡張 32 ビット ポインターです。 高いポインター ビットの状態を想定しても安全ではないことに注意してください。 |
Helper 関数
次のインライン関数 (Basetsd.h で定義) は、値をある型から別の型に安全に変換するのに役立ちます。
unsigned long HandleToUlong( const void *h )
long HandleToLong( const void *h )
void * LongToHandle( const long h )
unsigned long PtrToUlong( const void *p )
unsigned int PtrToUint( const void *p )
unsigned short PtrToUshort( const void *p )
long PtrToLong( const void *p )
int PtrToInt( const void *p )
short PtrToShort( const void *p )
void * IntToPtr( const int i )
void * UIntToPtr( const unsigned int ui )
void * LongToPtr( const long l )
void * ULongToPtr( const unsigned long ul )
WarningIntToPtr は int 値を符号拡張し、UIntToPtr は符号なし int 値をゼロ拡張し、LongToPtr は long 値を符号拡張して、ULongToPtr は符号なし long 値をゼロ拡張します。