为什么结果4294967292
代替-4
,即使两个整数类型都已签名?
#include <iostream>
void f(int & i)
{
i = -4;
}
int main()
{
long long i = 0;
f(reinterpret_cast<int &>(i));
std::cout << i << std::endl;
return 0;
}
答案 0 :(得分:6)
long long
似乎是架构上的64位和int
32位数。您正在使用32位整数引用,因此您只修改了不太重要的一半(您显然在普通的x86机器上编译,它使用little endian和两个补码进行签名整数表示。)
符号位以及更重要的一半都是0
s(初始化)。必须1
来打印相同的负值:
0000 0000 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111 1111 1111 1111 1100
^ ^
sign bit of long long sign bit of int
reinterpret_cast
仅保证您使用其他int
取回reinterpret_cast
,因此您可以将其打印为int
,或使用long long &
参数。< / p>