我对我的问题的标题不太准确,因为我不知道这个东西的真正名称。
我不断看到 Win32 API 如何在变量中存储超过 1 个值。
例如,WPARAM
和LPARAM
。这是一个long
“分为”两个的数字:高字和低字。当它取 32 位值,将其除以 2 并将其设置为两个 16 位值时,还有更多示例。
我怎样才能以这种方式自己设置变量?(创建一个变量,并将位划分为我需要的数量,并设置每个部分)
PS我主要是出于教育目的而询问,所以即使您不建议我自己这样做,我仍然会很感激答案。 谢谢。
我对我的问题的标题不太准确,因为我不知道这个东西的真正名称。
我不断看到 Win32 API 如何在变量中存储超过 1 个值。
例如,WPARAM
和LPARAM
。这是一个long
“分为”两个的数字:高字和低字。当它取 32 位值,将其除以 2 并将其设置为两个 16 位值时,还有更多示例。
我怎样才能以这种方式自己设置变量?(创建一个变量,并将位划分为我需要的数量,并设置每个部分)
PS我主要是出于教育目的而询问,所以即使您不建议我自己这样做,我仍然会很感激答案。 谢谢。
你可以这样做:
WPARAM param = (WPARAM)(hiByte << 8 | lowByte);
这设置了变量的 16 位param
。
而相反的操作是这样的:
//BYTE is defined in WinDef.h
BYTE lowByte = (BYTE)(param && 0xFF);
BYTE hiByte = (BYTE)((param >> 8) && 0xFF);
或者您可以使用宏LOBYTE
并HIBYTE
定义WinDef.h
为:
BYTE lowByte = LOBYTE(param);
BYTE hiByte = HIBYTE(param);
有(至少)两种方法可以实现这一点:
使用位移/掩码运算符<<
, >>
,&
和|
,类似这样的东西(只是一个例子,未经测试):
int loWord = ...;
int hiWord = ...;
LPARAM param = (hiWord << 16) | loWord;
...
loWord = param & 0xFFFF;
hiWord = param >> 16;
使用一种union
类型(尽管后一种会受到内存对齐和字节序问题的影响,因此它可能不是一个可移植的解决方案);在这里看一个例子。
它通常称为位掩码,定义它们的一种方法如下:
struct Param
{
unsigned wparam : 16; //16 bits
unsigned lparam : 16; //16 bits
};
通常不建议以这种方式定义它们,因为它们不可移植。这里的其他答案显示了一种更便携的方法。