我遇到了一个有趣的情况,根据正确的操作数类型,我得到了不同的结果,但我真的无法理解其中的原因。
以下是最小化的代码:
#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
提升为 uint64_t
然后执行其他操作,则我也能接受第二个输出结果。
但是,为什么 &
使用 0xFFFF (int32_t
) vs. 0xFFFFU (uint32_t
) 会导致这两个不同的输出结果呢?
0xFFFFll
(确保64位)。 - Cheers and hth. - Alfcheck & 0xFFFF
返回0x00008123
,(check & 0xFFFF) << 16
在立即窗口中返回0x81230000
,而(uint64_t)((check & 0xFFFF) << 16)
则返回0xffffffff81230000
。 - vgru