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

Ben*_*key 116 c++ winapi types dword

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

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

GMa*_*ckG 150

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

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

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


还要注意unsigned int没有必要有范围为0〜4294967295.看到这里.

  • +1解释.但我还是敢打赌,如果他们确实改变了DWORD,很多程序仍会破坏:) (16认同)
  • @Milhous:根据文档,它是32位:http://msdn.microsoft.com/en-us/library/cc230318.aspx. (6认同)
  • Windows 7 64位中的DWORD是无符号长的.因此,它已经改变了当前的开发者. (5认同)
  • 是的,我知道它不是一种类型,而且我认为它与可移植性以及将其与基础数据类型表示形式脱钩有关,但是您为我填补了许多空白。谢谢! (2认同)

Win*_*mer 91

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

当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会改变.

  • "unsigned int不再符合最不出意的原则"所指的是什么? (4认同)
  • 我认为他意味着int的大小不再等于处理器的最大本机字大小. (3认同)

Ale*_*x F 12

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


Yee*_*Fei 7

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

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

  • "字是16位"在1984年有意义,但实际上不再:-( (6认同)
  • 根据C或C ++标准,不允许使用8位“ int”。但是重点仍然是,有些平台具有16位的“ int”,而其他平台则具有32位的“ int”。 (2认同)
  • “字是 16 位,因此 DWORD 在所有平台上都将被称为 32 位” - 我很确定这是不正确的。术语 WORD 更多地与硬件相关,而不是与软件相关,因为它实际上是一个用于描述由特定体系结构的指令集处理的单个数据单元的术语。一个 WORD 可以是 8、16、32、64 或任意位数,具体取决于架构。 (2认同)