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才是合理的答案 0 :(得分:4)
n
可能是64位,但您的printf()
调用只需要32位。这是未定义的行为。在这种特殊情况下似乎正在发生的是剩余的比特被切断,并且只显示明显低位的32比特。其他平台/编译器/机器可能会做一些完全不同的事情。
您可以通过在格式字符串中传递正确的整数类型来解决此问题:
printf("%llu",n);
答案 1 :(得分:4)
程序行为在两个方面是不确定的,而你在另一个方面处于薄弱环节:
使用"%zu"
作为sizeof
返回类型的格式说明符。使用'%d'
会造成严重破坏,特别是如果您将多个参数传递给printf
。
unsigned long long
至少 64位。这在您的情况下并不重要,但不要假设它总是 64位。格式说明符必须为%llu
。