我有以下代码。目标是将两个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
如何正确成功检索值?
答案 0 :(得分:2)
first
是32位类型,您将其位移32位。这在技术上是未定义的行为,但最可能的结果是表达式的结果为0.您需要在将其移位之前将其强制转换为更大的类型。
uint64_t combined = (static_cast<uint64_t>(first) << 32) | second;
答案 1 :(得分:1)
当你执行first << 32
时,你在32位的空间内移位32位,所以在移位后没有剩余的位。移位的结果为0.您需要在移位之前将first
值转换为64位:
uint64_t combined = (uint64_t(first) << 32) | second;
答案 2 :(得分:0)
根据评论:
uint64_t
位操作运算符返回第一个参数的类型。因此,您需要将其投放到second
,以便为<select id="letters">
<option value="A">A<option>
<option value="B">B<option>
<option value="C">C<option>
<option value="D">D<option>
</select>
值留出空间。