我在IndiaBix.com上看到了以下问题。根据我的经验水平(刚学习C语言),上述代码的输出应该是0 (10000000 << 1 是00000000)
,但实际输出却是256。进一步分析后发现我们使用的是%d进行打印,它只支持4个字节,因此输出为256而不是0。
#include<stdio.h>
int main()
{
unsigned char i = 128;
printf("%d \n", i << 1);
return 0;
}
现在考虑下面的例子。
#include<stdio.h>
int main()
{
unsigned int i = 2147483648;(bit 31 = 1 and b0 to b30 are 0)
printf("%d \n", i<<1);
return 0;
}
当我将上述内容左移时,输出结果为0。由于%d支持int类型的值,因此输出结果应该是0,但是当我将%d更改为%ld时,输出结果仍然是0。由于%ld支持long int类型的值,因此输出结果不应该是0。为什么我会得到0作为输出结果。
printf
的格式说明符并不会改变您实际进行计算的类型的大小。unsigned int
通常是4个字节,但不能保证。对于您的类型使用错误的printf
说明符是非法的:未定义行为 可能会给您带来非常令人困惑的结果,包括崩溃,打印奇怪的东西,甚至看起来正常工作。 - BoBTFishunsigned char
变量在移位操作之前被提升为int
。 - Some programmer dude