我已经接触到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);
从外观上看,程序员似乎建议将一个函数的值放入另一个函数。但是,如果没有一些严肃的程序员魔术,这似乎是不可能的。在解密此代码段方面的任何帮助将不胜感激。
答案 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 :(得分: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。编译器说左侧必须是左值