位移不同导致类似的程序

时间:2011-06-22 16:48:06

标签: c bit-manipulation bit-shift

这是一个程序

#include<stdio.h>
#include<stdlib.h>
int main()
{
 unsigned char a=0x80;
 printf("%d\n",a<<1);
}

上面的输出是256 现在这是上述程序的另一个版本

#include<stdio.h>
#include<stdlib.h>
int main()
{
 unsigned char a=0x80;
  a=a<<1;
 printf("%d\n",a);
}

上面的输出是

0

就我的理解而言,我无法看出两者之间有什么区别? 也就是为什么输出在第一个中输出256而在第二个程序中输出0?这两个语句的差异是什么?

4 个答案:

答案 0 :(得分:10)

在您的平台上,unsigned char只有8位宽,因此当您将其分配回狭窄的a << 1时,a会将1从左端移出。另一方面,在printf调用中,a首先被提升为一个整数(在您的平台上比8位宽),因此该位存活。

答案 1 :(得分:5)

根据C语言的类型提升规则,表达式a << 1的类型为int。在第一个程序中,您正在使用此int,其值现为0x100,并将其直接传递给printf(),它可以按预期工作。

在第二个程序中,您的int被分配到unsigned char,从而导致0x100被截断为0x00

答案 2 :(得分:2)

<<将结果提升为(无符号)int,但在第二个示例中,您将其强制回(无符号)char,其中溢出回0. / p>

答案 3 :(得分:1)

在第二种情况下,a只有8位长,0x80 << 10x100然后转换为char剪辑顶部位,因此变为0x00

直接在printf语句中,它正在寻找int所以它不会剪辑它...