如何将 32 位有符号整数放入 64 位无符号整数的高 32 位?
How to put 32-bit signed integer into higher 32 bits of 64-bit unsigned integer?
示例:
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++ 代码就可以)。
非常感谢你的帮助。
警告与 si32
本身的大小有关。基本上步骤顺序如下所示:
- 取
si32
(这是一个32位的值)
- 将该值移动 32 位(即将 32 位值移动 32 位)
- 分配给
ui64
。
要解决此问题,您可以先将 si32
转换为正确的 64 位类型,然后再将其移动 32 位,这样位移将对 64 位值进行操作:
quint64 ui64 = ((quint64) si32) << 32;
示例:
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++ 代码就可以)。
非常感谢你的帮助。
警告与 si32
本身的大小有关。基本上步骤顺序如下所示:
- 取
si32
(这是一个32位的值) - 将该值移动 32 位(即将 32 位值移动 32 位)
- 分配给
ui64
。
要解决此问题,您可以先将 si32
转换为正确的 64 位类型,然后再将其移动 32 位,这样位移将对 64 位值进行操作:
quint64 ui64 = ((quint64) si32) << 32;