web-dev-qa-db-ja.com

C ++では、unsigned intではなくDWORDを使用するのはなぜですか?

私は多少C++初心者であると認めることを恐れないので、これはばかげた質問のように思えるかもしれませんが...

コード例では、DWORDが至る所で使用されています。 DWORDの真の意味を調べると、明らかに符号なし整数(0〜4,294,967,295)にすぎません。だから私の質問は、なぜDWORDがあるのですか?整数型「unsigned int」では得られないことは何ですか?移植性とマシンの違いに関係がありますか?

116
Ben Lakey

DWORDはC++型ではなく、<windows.h>で定義されています。

その理由は、DWORDにはWindows関数が依存する特定の範囲と形式があるため、その特定の範囲が必要な場合はそのタイプを使用するからです。 (または、彼らが「ローマにいるとき、ローマ人がするように」と言うように。)あなたにとって、それはたまたまunsigned intに対応していますが、常にそうであるとは限りません。安全のため、実際に何であるかに関係なく、DWORDが予想される場合はDWORDを使用してください。

たとえば、unsigned intの範囲または形式を変更した場合、DWORDの基になる異なる型を使用して同じ要件を維持でき、DWORDを使用するすべてのコードは適切ではありません。 (同様に、彼らはDWORDunsigned long longである必要があると判断し、それを変更することができ、DWORDを使用するすべてのコードは無意味になります。)


また、unsigned intには0〜4,294,967,295の範囲が必要であるnotがあることに注意してください。 here を参照してください。

149
GManNickG

MS-DOSおよびWindows 3.1が16ビットモードで動作する場合、Intel 8086 Wordは16ビット、Microsoft Wordは16ビット、Microsoft DWORDは32ビット、典型的なコンパイラの符号なしintは16ビットでした。

Windows NTが32ビットモードで動作する場合、Intel 80386 Wordは32ビット、Microsoft Wordは16ビット、Microsoft DWORDは32ビット、典型的なコンパイラの符号なし整数は32ビットでした。 WordおよびDWORDという名前はもはや自己記述的ではありませんが、Microsoftプログラムの機能を保持しています。

Windowsが64ビットモードで動作する場合、Intel Wordは64ビット、Microsoft Wordは16ビット、Microsoft DWORDは32ビット、一般的なコンパイラのunsigned intは32ビットです。 WordおよびDWORDという名前は自己記述的ではなくなり、unsigned intは最小限の驚きの原則に適合しなくなりましたが、多くのプログラムの機能を維持しています。

WordやDWORDが変わることはないと思います。

89

SDK開発者は、typedefを使用して独自の型を定義することを好みます。これにより、すべてのクライアントコードを変更せずに、1つの場所でのみ基本型を変更できます。この規則に従うことが重要です。 DWORDが変更されることはほとんどありませんが、DWORD_PTRなどのタイプは、Win32やx64などのプラットフォームによって異なります。したがって、一部の関数にDWORDパラメーターがある場合は、unsigned intではなくDWORDを使用すると、コードはすべての将来のWindowsヘッダーバージョンでコンパイルされます。

11
Alex F

私自身は、unsigned intはプラットフォーム固有であると想定しています。整数は、8ビット、16ビット、32ビット、さらには64ビットです。

一方、DWORDは、独自のサイズであるダブルワードを指定します。ワードは16ビットなので、DWORDはすべてのプラットフォームで32ビットとして認識されます

6
YeenFei