为什么我不能将这些整体打包在一起?

时间:2017-09-13 00:28:35

标签: c++

我有以下代码。目标是将两个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

如何正确成功检索值?

3 个答案:

答案 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> 值留出空间。