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 和二进制补码表示有符号整数)。
符号位,以及更重要的一半都是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 &
参数.
即使两种整数类型都已签名,为什么结果是 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 和二进制补码表示有符号整数)。
符号位,以及更重要的一半都是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 &
参数.