LOWORD和HIWORD操作

时间:2018-09-21 00:30:50

标签: c++ hex bit-shift arithmetic-expressions

我已经接触到C ++程序中的一些奇怪的符号。我正在处理位移,并且遇到了LOWORD()和HIWORD()函数。我知道LOWORD是整数的低2个字节的值。我也知道HIWORD是该整数的高2个字节。但是,我接触了一个看起来像这样的代码段:

#define LOWORD(l)           ((WORD)(((DWORD_PTR)(l)) & 0xffff))
#define HIWORD(l)           ((WORD)((((DWORD_PTR)(l)) >> 16) & 0xffff))

int v1 = 0x12343460;
int v2 = 0x11111111;
HIWORD(v2) = HIWORD(v1);
LOWORD(v1) = LOWORD(v2);

从外观上看,程序员似乎建议将一个函数的值放入另一个函数。但是,如果没有一些严肃的程序员魔术,这似乎是不可能的。在解密此代码段方面的任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

哇,那真是可怕的代码。关于 only 方式,我可以看到(作为函数)工作是如果函数返回对传入的变量部分的引用。换句话说,就像:

#include <iostream>

unsigned short int & HIWORD(unsigned int & x) {
    return *(reinterpret_cast<unsigned short int *>(&x) + 1);
}

unsigned short int & LOWORD(unsigned int & x) {
    return *(reinterpret_cast<unsigned short int *>(&x) + 0);
}

int main() {
    unsigned int v1 = 0x11112222;
    unsigned int v2 = 0x33334444;

    std::cout << "Before: " << std::hex << v1 << ' '  << v2 << '\n';

    HIWORD(v2) = HIWORD(v1);
    LOWORD(v1) = LOWORD(v2);

    std::cout << "After : " << std::hex << v1 << ' '  << v2 << '\n';
}

(至少在我的系统上)这会生成您可能看到的内容:

Before: 11112222 33334444
After : 11114444 11114444

但是,如果您实际上看到这样的代码,我建议您采取两种行动方式之一:

  1. 修复它。您可以执行大约一百种更好的方法来完成同一件事。
  2. 离开。走吧。不要收集您的物品。只是从椅子上站起来,走出门,坐上车,开车离开,再也不会回来:-)

现在可能,它们可能是宏而不是函数,但我的建议仍然是关于两种可能的选择。

答案 1 :(得分:1)

要修复它:

#define HIDWORD(dw, hw) LOWORD(dw) | (hw << 16)
#define LODWORD(dw, lw) (HIWORD(dw) << 16) | lw
-----------------------------------------------
v2 = HIDWORD(v2, HIWORD(v1));
v1 = LODWORD(v1, LOWORD(v2));

答案 2 :(得分:0)

就像您提供的那样尝试过代码,但没有编译

这是这些宏的定义方式

Y

WORD为uint16_t,DWORD_PTR为uint32_t。编译器说左侧必须是左值