reinterpret_cast 的有符号整数引用

reinterpret_cast of signed int reference

即使两种整数类型都已签名,为什么结果是 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;
}

long long 在您的体系结构上似乎是 64 位和 int 32 位数字。您使用的是 32 位整数引用,因此您只修改了不太重要的一半(您显然是在普通的 x86 机器上编译,它使用 little endian 和二进制补码表示有符号整数)。

符号位,以及更重要的一半都是0s(初始化时)。打印相同的负值必须是 1s:

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 只保证你用另一个 reinterpret_cast 取回你的 int,所以你要么将它打印为 int,要么使用 long long & 参数.