为什么在 C + + 中我们使用 DWORD 而不是无符号整型?

我不怕承认自己是一个 C + + 的新手,所以这个问题可能看起来有点傻,但是... ..。

我看到 DWORD 在代码示例中被广泛使用。当我查找 DWORD 的真正含义时,它显然只是一个无符号 int (0到4,294,967,295)。所以我的问题是,为什么我们有 DWORD?它给了我们什么积分类型‘ unsignedint’没有的东西?它是否与可移植性和机器差异有关?

194469 次浏览

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

原因是 DWORD有一个特定的范围和格式 Windows 函数所依赖的,所以如果您需要该特定范围使用该类型。(或者像他们说的“入乡随俗”。)对于您来说,这碰巧对应于 unsigned int,但是情况可能并不总是如此。为了安全起见,在预期 DWORD时使用 DWORD,而不管它实际上可能是什么。

例如,如果他们曾经改变了 unsigned int的范围或格式,他们可以使用不同的类型来保持相同的需求,而所有使用 DWORD的代码都是不明智的。(同样,他们可以决定 DWORD需要成为 unsigned long long,然后修改它,使用 DWORD的所有代码都将一无所知。)


还要注意的是,unsigned int没有必须在0到4,294,967,295的范围内。参见 给你

SDK 开发人员更喜欢使用 typedef 定义自己的类型。这样只允许在一个位置更改基础类型,而不需要更改所有客户端代码。遵循这个惯例很重要。DWORD 不太可能被更改,但是类似 DWORD _ PTR 的类型在不同的平台上是不同的,比如 Win32和 x64。因此,如果某个函数有 DWORD 参数,使用 DWORD 而不是无符号 int,那么您的代码将在以后的所有窗口头文件版本中进行编译。

对我来说,我会假设 unsigned int是平台特定的,整数可以是16位、32位甚至64位。

另一方面,DWORD指定自己的大小,即 Double Word。单词是16位的,所以在所有平台上,DWORD将被称为32位。

当 MS-DOS 和 Windows 3.1在16位模式下运行时,一个 Intel 8086字是16位,一个 Microsoft WORD 是16位,一个 Microsoft DWORD 是32位,一个典型的编译器的无符号 int 是16位。

当 Windows NT 在32位模式下运行时,Intel 80386字是32位,Microsoft WORD 是16位,Microsoft DWORD 是32位,典型的编译器的无符号 int 是32位。WORD 和 DWORD 这两个名字不再是自我描述的,但它们保留了微软程序的功能。

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

我认为 WORD 或 DWORD 永远不会改变。