reinterpret_cast已签名的 int 引用

reinterpret_cast of signed int reference

本文关键字:int 引用 cast reinterpret      更新时间:2023-10-16

为什么即使两个整数类型都有符号,结果也会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 机器上进行编译,该机器使用小端序和 two 补码进行有符号整数表示)。

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

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 &参数。