reinterpret_cast of signed int reference

时间:2016-01-15 13:14:21

标签: c++ integer reinterpret-cast

为什么结果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;
}

1 个答案:

答案 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>