【问题标题】:LOWORD and HIWORD operationsLOWORD 和 HIWORD 操作
【发布时间】:2019-02-25 08:24:16
【问题描述】:

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

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

从外观上看,程序员似乎建议将一个函数的值放入另一个函数中。然而,如果没有一些严肃的程序员魔法,这似乎是不可能的。任何解密此代码 sn-p 的帮助将不胜感激。

【问题讨论】:

  • 因为它们通常是在 Win32 API 中定义的,所以这不可能工作(可能除了 LOWORD 一个,这要归功于左值转换非标准扩展)。如果你有不同的定义,你应该发布它们。
  • 好的,如果您“了解”LOWORDHIWORD 是什么,那么您的问题到底是什么?这里没有人知道LOWORDHIWORD 是什么,因为您的问题中没有显示这些神秘函数或宏的定义。你比读过这个问题的任何人都更了解他们。要回答这里唯一的实际问题,不,这段代码没有“任何意义”,因为没有显示HIWORDLOWORD 的工作原理,任何人在这里唯一能做的就是推测这些神秘的东西功能可能是。
  • 投票关闭,因为缺乏可重复的例子。
  • 您需要显示HIWORDLOWORD定义。我们不会用英语编码 :-)
  • @SeverinPappadeux,种方法可以工作(请参阅我对其中一种的回答)。然而,就像用钝勺子挖出自己的心脏一样,这并不是一个好主意:-)

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


【解决方案1】:

刚刚尝试了您提供的代码,但没有编译

这些宏是如何定义的

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

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

【讨论】:

  • "DWORD_PTR is uint32_t" - 仅当编译为 32 位时。如果编译为 64 位,则改为 uint64_t。这就是 _PTR 所指的 - 它是一个指针大小的整数。
【解决方案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. 离开。走吧。不要收集你的财物。只需从椅子上起身,走出门,上车,开走,再也不回来:-)

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

【讨论】:

    【解决方案3】:

    修复它:

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

    【讨论】:

    • 我认为这是最好的假设。当我看到这个问题时,我最初认为,“这可能是某种类型的交换。”如果我是正确的,在您的示例中,我们将“v1 和 v2”的低位和高位词交错在一起?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 2012-03-14
    • 1970-01-01
    相关资源
    最近更新 更多