我在一段指令代码中遇到了这个宏MAKEWORD(2,2)。我在MSDN中读到它“通过连接指定的值来创建WORD值”。

问题是,WORD是否不像无符号整数?为什么我需要做这样一个奇怪的过程,例如使用MAKEWORD()

最佳答案

宏期望两个字节作为其参数:

WORD MAKEWORD(
  BYTE bLow,
  BYTE bHigh
);

它在Windef.h中定义为:
#define MAKEWORD(a,b)   ((WORD)(((BYTE)(a))|(((WORD)((BYTE)(b)))<<8)))

它基本上是从两个1字节的单词构建一个16位的单词(看起来不太便携)

具有1个字节(一个WORD)的数字2的二进制表示形式是:
| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |

如果我们像MAKEWORD(2,2)那样将其中两个字节串联起来,则会得到:

| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |

512 + 2 = 514:live demo.

这个特定宏的唯一真实示例是Initialization of Winsock,用于生成WSAStartup期望的版本控制字。

09-06 17:14