【问题标题】:Bitshifting long int returns wrong data移位 long int 返回错误数据
【发布时间】:2017-12-02 12:35:31
【问题描述】:

我试图从一个函数中返回两个 32 位 int 值(_mouseX 和 _mouseY),方法是先将它们打包成一个 64 位值,然后在我使用它们时在代码中的其他位置解包它们。但是,当我通过此功能获取数据时,数据完全不正确。我已经确认原始 _mouseX 和 _mouseY 数据以及 SetOrientation 函数都可以;问题出在我在此 GetMouseXY 函数中使用的位移或类型转换中。你能看看吗?谢谢。

long int Input::GetMouseXY()
{
    return (_mouseX << 32) |_mouseY;
}

long int mouseY = pInput->GetMouseXY() & 0xFFFFFFFF;
long int mouseX = (pInput->GetMouseXY() >> 32) & 0xFFFFFFFF;
_CamPosition->SetOrientation(XMFLOAT3((float)mouseY, (float)mouseX, 0.f));

【问题讨论】:

  • 将 32 位值移动 32 个位置是未定义的。您必须将其设为 64 位 first
  • 编译器应该警告你这个错误。你读过编译器警告吗?如果编译器静音,请提高警告级别(如 g++ -Wall 等...)。

标签: c++ bit-manipulation long-integer bit-shift unsigned


【解决方案1】:

使用(long int)_mouseX&lt;&lt;32|_mouseY,因为在移位32之前需要转换为64位类型。

两个注意事项:首先,如果需要 64 位类型,请使用 std::uint64_t。第二:你为什么不为此使用结构?喜欢

struct MouseCoord {
    uint32_t x, y;
};

MouseCoord Input::GetMouseXY();

更清楚地看到发生了什么。

【讨论】:

  • 我只是想用更少的行优雅地完成它。此外,我觉得这会导致更多的混乱(也可能导致性能成本?)必须声明一个新结构并使其可供使用它的两个类访问。
  • @Dude:我不认为它很优雅。通常,此类 GUI 代码库包含一个 2D 点结构,因此您不必为此定义一个。或者,如果您不想定义新结构,则可以只使用std::array&lt;uint32_t, 2&gt;。我认为鼠标坐标访问器功能中的性能并不重要。在 64 位代码中,寄存器中返回一个 64 位结构,就像一个 64 位数字一样,所以性能是一样的。
  • @Dude:当心,左移有符号整数的定义不是很好。而 long int 在 LLP64 平台(WIN64)上只有 32 位。它不会让代码更优雅,只是更不便携。
猜你喜欢
  • 2023-03-29
  • 2021-02-10
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多