我遇到了一个有趣的场景,根据正确的操作数类型,我得到了不同的结果,我无法真正理解其原因。
这是最小的代码:
#include <iostream>
#include <cstdint>
int main()
{
uint16_t check = 0x8123U;
uint64_t new_check = (check & 0xFFFF) << 16;
std::cout << std::hex << new_check << std::endl;
new_check = (check & 0xFFFFU) << 16;
std::cout << std::hex << new_check << std::endl;
return 0;
}
我在 Linux 64 位上使用 g++(gcc 版本 4.5.2)编译了这段代码:g++ -std=c++0x -Wall example.cpp -o example
输出是:
ffffffff81230000
81230000
在第一种情况下,我无法真正理解输出的原因。
为什么在某些时候将任何时间计算结果提升为有符号的 64 位值 ( int64_t
),从而导致符号扩展?
如果首先将 16 位值向左移动 16 位然后提升为 64 位值,我将在这两种情况下都接受“0”的结果。check
如果编译器首先提升touint64_t
然后执行其他操作,我也会接受第二个输出。
但是&
0xFFFF ( int32_t
) 与 0xFFFFU ( uint32_t
) 怎么会导致这两个不同的输出呢?