当我编写以下程序并使用GNU C++编译器时,1我认为输出是由编译器执行的旋转操作引起的.
#include <iostream>
int main()
{
int a = 1;
std::cout << (a << 32) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但从逻辑上讲,正如所说的那样,如果位溢出位宽就会丢失,输出应为0.发生了什么?
代码在ideone上,http: //ideone.com/VPTwj .
有人可以向我解释以下代码输出:
void myprint(unsigned long a)
{
printf("Input is %lx\n", a);
}
int main()
{
myprint(1 << 31);
myprint(0x80000000);
}
Run Code Online (Sandbox Code Playgroud)
输出gcc main.c:
Input is ffffffff80000000
Input is 80000000
Run Code Online (Sandbox Code Playgroud)
为什么被(1 << 31)视为签名并被0x80000000视为未签名?
int z = 1;
z <<= 31;
z >>= 31;
printf ("%d\n",z);
Run Code Online (Sandbox Code Playgroud)
当我运行代码时z=-1,为什么?