我有以下代码。我们的目标是将两个uint32_t
小号组合成一个单一的uint64_t
,然后检索值。为什么我不能将这些内容整理在一起?
#include <iostream>
#include <cstdint>
int main()
{
uint32_t first = 5;
uint32_t second = 6;
uint64_t combined = (first << 32) | second;
uint32_t firstR = combined >> 32;
uint32_t secondR = combined & 0xffffffff;
std::cout << "F: " << firstR << " S: " << secondR << std::endl;
}
它输出
F: 0 S: 7
如何成功找回正确的价值观?
你应该尝试使用一个编译器,它自己检测你的编程错误,并且责骂你:'warning:left shift count> = type [-Wshift-count-overflow]'的宽度'。当然,这将是gcc。你的'int'是32位,因此你的左移操作在32位值上运行,并溢出。在移动之前,将'first'明确地强制转换为'uint64_t'。然后切换到gcc,这是整个宇宙中最好的编译器,而不仅仅是这个世界。 –