当大小为64位时,为什么左移32次给出零

时间:2017-12-13 09:47:46

标签: c

unsigned long long n=123;
printf("size of n:%d\n",sizeof(n)); //output of this line is "size of n:8"
n=n<<32;
printf("%u",n); //output of this line is "0"

当大小为64位时,为什么输出为0 仅当大小为32位

时,输出0才是合理的

2 个答案:

答案 0 :(得分:4)

n可能是64位,但您的printf()调用只需要32位。这是未定义的行为。在这种特殊情况下似乎正在发生的是剩余的比特被切断,并且只显示明显低位的32比特。其他平台/编译器/机器可能会做一些完全不同的事情。

您可以通过在格式字符串中传递正确的整数类型来解决此问题:

printf("%llu",n);

答案 1 :(得分:4)

程序行为在两个方面是不确定的,而你在另一个方面处于薄弱环节:

  1. 使用"%zu"作为sizeof返回类型的格式说明符。使用'%d'会造成严重破坏,特别是如果您将多个参数传递给printf

  2. unsigned long long 至少 64位。这在您的情况下并不重要,但不要假设它总是 64位。格式说明符必须为%llu

  3. 参考:http://en.cppreference.com/w/c/io/fprintf