如何将32位有符号整数放入64位无符号整数的高32位?

3

例子:

qint32 si32 = -1; // that gives us 0xFFFFFFFF
quint64 ui64 = si32; // that gives us 0xFFFFFFFFFFFFFFFF, that is expected

期望的结果:

0xFFFFFFFF00000000

当我试图像这样在si32上移位时
quint64 ui64 = si32 << 32;

编译器警告我有位移溢出的问题。

这似乎是个简单的任务,但我无法想出如何解决。 这是一个Unix C++代码(使用QT,但这并不重要,普通的Unix C++代码也可以)。

我将感激你的帮助。


1
“纯UNIX C++代码就可以了”。那么,为什么不发布一个[MCVE],而不包含“无关紧要”的内容呢? - πάντα ῥεῖ
3
quint64 ui64 = ((quint64)si32) << 32; 这行代码是将一个 signed int 类型的变量转换为 unsigned long long 类型,并左移32位,赋值给 ui64 这个变量。不清楚这段代码是否会引起错误。 - Niall
我猜你得先使用 quint64 进行移位操作。如果你用 qint32 进行 32 位移位操作,那么就什么都不会剩下了。quint64 temp = si32; temp << 32 我认为是可以正常工作的。 - 463035818_is_not_a_number
2
@rightaway717:基本思想是,任何想要重现你的结果的人都不应该需要做更多的事情,只需复制、保存、编译、运行。这意味着一个示例应尽可能能够在尽可能多的目标上进行编译。用标准类型替换 Qt 特定类型并添加必要的 int main() 样板可以节省 所有人 的时间——除了你自己当然,但再说一遍,你想要答案,这确保你没有忽略任何细节,同时你的示例是有效的代码。例如,你本来可以发现你的问题与 Qt 没有任何关系。 - DevSolar
1
@DevSolar,不过答案仍然使用了QT类型。 :) - Devolus
显示剩余9条评论
1个回答

7
这个警告与 si32 的大小有关。基本上,步骤如下所示:
  1. 取出 si32(一个 32 位值)
  2. 将该值向左移动 32 位(即将 32 位值向左移动 32 位)
  3. 将其分配给 ui64
为了解决这个问题,您可以先将 si32 转换为正确的 64 位类型,然后再将其向左移动 32 位,以便位移操作作用于 64 位值。
quint64 ui64 = ((quint64) si32) << 32;

谢谢,可以了。我实际上尝试过了,但可能错过了什么,导致结果不正确。 - rightaway717
1
@rightaway717,重要的一点是,你需要将它转换为无符号类型。否则编译器可能会对该值进行符号扩展,从而导致错误的结果。在你给出的示例中,这不会引起注意,但如果你尝试一个最高位设置的位模式,你就会看到效果。 - Devolus
@Devolus 所以如果我理解正确,我不能像这样转换为有符号类型,因为不清楚最高位(符号位)是否设置了吗? - rightaway717
必须假定已设置位的有符号值,这就是编译器可以使用指令扩展符号的原因。因此,在移动期间避免意外结果,您必须始终进行无符号转换。 - Devolus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接