MAKEWORD用于什么?

时间:2014-06-10 02:14:20

标签: c++ winapi

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

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

3 个答案:

答案 0 :(得分:13)

宏需要两个字节作为参数:

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期望的版本控制字。

答案 1 :(得分:2)

粗略地说,MAKEWORD(x,y)相当于((y) << 8 | (x));这在将两个字节大小的值打包到单个16位字段时很有用,这通常发生在通用消息结构中。补充操作由LOBYTEHIBYTE宏执行,它从WORD操作数中提取低位或高位字节。

在Windows的16位时代,这个宏被大量使用,但是一旦32位程序占据主导地位,它的重要性就会下降。 16位Windows的另一个痕迹在于MSG结构成员wParamlParam的名称,它们最初分别是WORDLONG;他们现在都是LONG

Trememdous历史见解可以在Charles Petzold的书中找到,Programming Windows, second edition

答案 2 :(得分:0)

许多小型数字设备(例如数字温度计)会将其数据存储在 8 位寄存器中。一个 8 位寄存器可以存储 -127 和 127 之间的有符号数。所以要存储低于 -127 或高于 127 的数字,需要使用两个 8 位寄存器:低 8 位存储在寄存器 1 中,高 8 位存储在寄存器 2 中.读取数据的计算机需要从这两个寄存器中取出数据,然后重新组合这两个值以产生一个介于 -32767 和 32767 之间的 16 位数字。 MAKEWORD 宏是一种快速组合这两个小 8 位数字的方法成一个更大的 16 位数字。如果数据更高,它将存储在更多的 8 位寄存器中。 希望这是有道理的。

相关问题