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
但是,如果您确实看到这样的代码,我建议您采取以下两种行动之一:
- 修复它。有大约一百种更好的方法可以做同样的事情。
- 离开。走吧。不要收集你的物品。从椅子上站起来,走出门,上车,开走,再也不会回来:-)
现在可能它们可能是宏而不是函数,但我的建议仍然适用于这两个可能的选项。
修复它:
#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));
我在 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
但是,如果您确实看到这样的代码,我建议您采取以下两种行动之一:
- 修复它。有大约一百种更好的方法可以做同样的事情。
- 离开。走吧。不要收集你的物品。从椅子上站起来,走出门,上车,开走,再也不会回来:-)
现在可能它们可能是宏而不是函数,但我的建议仍然适用于这两个可能的选项。
修复它:
#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));