我刚刚开始学习WinAPI。在MSDN中,为WORD数据类型提供了以下说明。
它很简单,并且与我一直在学习中使用的其他资源相匹配,但是怎么可以确定地说它是16位呢? Wikipedia上的C data types页面指定
因此,根据C标准,short
的大小很可能为32位。但是谁决定要使用什么位大小呢?我在这里找到了practical explanation。具体来说,该行:
因此,这就是ISA,我认为这是有道理的。这是我迷路的地方。看一下Wikipedia上的Windows page,我在侧栏中看到了这一点:
我真的不知道这些是什么,但我认为它们是处理器,每个处理器都有一个ISA。也许Windows支持这些平台,因为它们都可以保证对unsigned short
使用16位吗?这听起来不太正确,但是我对这方面的知识还不够了解,无法进一步研究。
回到我的问题:当C标准本身不保证typedef unsigned short WORD;
始终为16位时,Windows API如何可以WORD
然后说short
是16位无符号整数?
最佳答案
简而言之,WORD
始终为16位。
由于WORD
始终为16位,但unsigned short
并非为16位,因此WORD
并不总是unsigned short
。
对于Windows SDK支持的每个平台,Windows头文件都包含#ifdef
样式宏,这些宏可以检测编译器及其平台,并将Windows SDK定义的类型(WORD
,DWORD
等)与适当大小的平台类型相关联。
这就是为什么Windows SDK实际上使用内部定义的类型(例如WORD
)而不是使用语言类型的原因:这样它们可以确保其定义始终正确。
Microsoft工具链附带的Windows SDK可能很懒,因为Microsoft c++工具链始终使用16位无符号短裤。
我不希望Visual Studio C++附带的windows.h如果掉入GCC,clang等中时会正常工作,因为许多细节(包括使用Platform SDK分发的.iib文件导入dll的机制)是Microsoft特定的执行。
另一种解释是:
微软说WORD
是16位。如果“某人”想要调用Windows API,则他们必须传递一个16位值,其中API将字段定义为WORD。
微软还可能说,为了使用其Windows SDK中存在的Windows头文件来构建有效的Windows程序,用户必须选择具有16位short
的编译器。
C++规范没有说编译器必须将short
实现为16位-微软表示,您选择构建Windows可执行文件的编译器必须这样做。
关于c - Microsoft如何说WinAPI中单词的大小为16位?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37308438/