为什么在C ++中我们使用DWORD而不是unsigned int?

时间:2010-06-08 06:42:43

标签: c++ winapi types dword

我不敢承认我有点像C ++新手,所以这看起来似乎是一个愚蠢的问题但是....

我看到DWORD在代码示例中使用了所有地方。当我查看DWORD的真正含义时,它显然只是一个无符号整数(0到4,294,967,295)。所以我的问题是,为什么我们有DWORD?它给了我们积分类型'unsigned int'不是什么?它与便携性和机器差异有关吗?

4 个答案:

答案 0 :(得分:143)

DWORD不是C ++类型,它在<windows.h>中定义。

原因是DWORD具有Windows功能所依赖的特定范围和格式,因此如果您需要该特定范围,请使用该类型。 (或者正如他们所说的“在罗马时,像罗马人那样做。”)对于你来说,这恰好与unsigned int相对应,但情况可能并非总是如此。为安全起见,请在DWORD时使用DWORD,无论其实际情况如何。

例如,如果他们更改了unsigned int的范围或格式,他们可以使用不同的类型来代替DWORD以保持相同的要求,并且使用DWORD的所有代码都将是没有最明智的。 (同样,他们可以决定DWORD需要unsigned long long,更改它,使用DWORD的所有代码都不会更明智。)


另请注意unsigned int 必须具有0到4,294,967,295的范围。请参阅here

答案 1 :(得分:87)

当MS-DOS和Windows 3.1在16位模式下运行时,Intel 8086字为16位,Microsoft WORD为16位,Microsoft DWORD为32位,典型编译器的unsigned int为16位。 / p>

当Windows NT在32位模式下运行时,Intel 80386字为32位,Microsoft WORD为16位,Microsoft DWORD为32位,典型编译器的unsigned int为32位。名称WORD和DWORD不再是自我描述性的,但它们保留了Microsoft程序的功能。

当Windows以64位模式运行时,Intel字为64位,Microsoft WORD为16位,Microsoft DWORD为32位,典型编译器的unsigned int为32位。名称WORD和DWORD不再是自描述的,而unsigned int不再符合最少惊喜的原则,但它们保留了许多程序的功能。

我不认为WORD或DWORD会改变。

答案 2 :(得分:10)

SDK开发人员更喜欢使用typedef定义自己的类型。这允许仅在一个地方更改基础类型,而无需更改所有客户端代码。遵循这一惯例很重要。 DWORD不太可能被更改,但像DWORD_PTR这样的类型在不同的平台上是不同的,如Win32和x64。因此,如果某个函数具有DWORD参数,请使用DWORD而不是unsigned int,并且您的代码将在以后的所有Windows头文件中编译。

答案 3 :(得分:6)

对于我自己,我认为unsigned int是特定于平台的。整数可以是8位,16位,32位甚至64位。

另一方面,

DWORD指定自己的大小,即双字。字是16位,因此所有平台上的DWORD将被称为32位