LOWORD 和 HIWORD 操作

LOWORD and HIWORD operations

我在 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);

从表面上看,程序员似乎在建议将一个函数的值放入另一个函数中。然而,如果没有一些严肃的程序员魔法,这似乎是不可能的。对于解密此代码片段的任何帮助,我们将不胜感激。

刚刚尝试了您提供的代码,但无法编译

这些宏是如何定义的

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

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

哇,这真是可怕的代码。关于 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. 离开。走吧。不要收集你的物品。从椅子上站起来,走出门,上车,开走,再也不会回来:-)

现在可能它们可能是宏而不是函数,但我的建议仍然适用于这两个可能的选项。

修复它:

#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));