新しいデータ型

新しいデータ型には、固定精度整数型、ポインター精度整数型、および特定精度ポインター型の 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 )

WarningIntToPtrint 値を符号拡張し、UIntToPtr は符号なし int 値をゼロ拡張し、LongToPtrlong 値を符号拡張して、ULongToPtr符号なし long 値をゼロ拡張します。