我在一段教学代码中遇到了这个宏MAKEWORD(2,2)
。我在MSDN中读到它“通过连接指定的值来创建一个单词值”。
问题是,难道一个词不像一个无符号整数,为什么我需要做这样一个奇怪的过程,比如使用MAKEWORD()
发布于 2014-06-10 02:27:27
宏需要两个字节作为其参数:
WORD MAKEWORD(
BYTE bLow,
BYTE bHigh
);
它在Windef.h
中的定义为:
#define MAKEWORD(a,b) ((WORD)(((BYTE)(a))|(((WORD)((BYTE)(b)))<<8)))
它基本上是从两个1字节字构建一个16位字(而且看起来不是很可移植)。
具有一个字节(一个单词)的数字2的二进制表示形式是:x 0、0、0、0、2、0、0、0、0、0、2、0、0、0、0、0、2、0、0、0、0、0、0、0、0、0、0、1、1、1、1、1、1、1、1、1、0、1、0、1、0、0、0、0、0、0、0、0、0、0、0、0、0、2、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、2、1、2、1、2、1、2、1、2、1、0、2、0、0、0、0、0、0、0
如果我们像在MAKEWORD(2,2)
中那样将其中的两个字节连在一起,就会得到:
\x{e76f}\x{e76f}0\x{e76f}\x{e76f}0\x{e76f}\#**##.
为512 +2= 514:现场演示。
这个特定宏的唯一实际示例是在Winsock初始化中,以生成WSAStartup
所期望的版本控制单词。
发布于 2014-06-10 02:29:19
粗略地说,MAKEWORD(x,y)
等同于((y) << 8 | (x))
;当将两个字节大小的值打包到一个16位字段中时,这是非常有用的,就像通用消息结构中经常发生的那样。互补操作由LOBYTE
和HIBYTE
宏执行,它们从WORD
操作数中提取低阶或高阶字节。
在Windows的16位时代,宏得到了相当大的应用,但一旦32位程序占据主导地位,它的重要性就下降了。16位Windows的另一个痕迹是MSG
结构成员wParam
和lParam
的名称,它们最初分别键入WORD
和LONG
;它们现在都是LONG
。
在查理斯·佩佐德的“Windows编程,第二版”一书中,可以找到一段曲折的历史洞察力。
https://stackoverflow.com/questions/24131843
复制相似问题