在变量中存储多个值

时间:2012-06-04 08:39:47

标签: c++

我对问题的标题不太准确,因为我不知道这件事是如何被称为的。

我一直在看Win32 API如何在变量中存储多于1个值。

例如,WPARAMLPARAM。这是一个long数字,被“划分”为两个:高字和低字。 当它需要32位值时,还有更多的例子,将它除以2并将其设置为两个16位值。

如何以这种方式设置变量? (创建一个变量,并将这些位除以我需要的数量,并设置每个部分)

P.S。我主要是为了教育目的而要求,所以即使你不建议我自己这样做,我仍然会欣赏答案。 感谢。

3 个答案:

答案 0 :(得分:1)

你可以这样做:

WPARAM param = (WPARAM)(hiByte << 8 | lowByte);

设置变量param的16位。

反向操作是这样的:

//BYTE  is defined in WinDef.h
BYTE lowByte = (BYTE)(param && 0xFF);
BYTE hiByte =  (BYTE)((param >> 8) && 0xFF);

或者您可以使用LOBYTE中定义的宏HIBYTEWinDef.h作为:

BYTE lowByte = LOBYTE(param);
BYTE hiByte =  HIBYTE(param);

答案 1 :(得分:1)

有(至少)两种方法可以实现这一目标:

  • 使用位移/掩码运算符<<>>&|,就像这样(只是一个示例,未经过测试):< / p>

    int loWord = ...;
    int hiWord = ...;
    LPARAM param = (hiWord << 16) | loWord;
    ...
    loWord = param & 0xFFFF;
    hiWord = param >> 16;
    
  • 使用union类型(虽然后者会受到内存对齐和字节序问题的影响,因此它可能不是一个可移植的解决方案); see an example here

答案 2 :(得分:1)

它通常称为位掩码,定义它们的一种方法可以如下:

struct Param
{
   unsigned wparam   : 16;     //16 bits
   unsigned lparam   : 16;     //16 bits
};

通常不建议以这种方式定义它们,因为它们不可移植。这里的其他答案显示了一种更便携的方式。