这是一个程序
#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?这两个语句的差异是什么?
答案 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 << 1
是0x100
然后转换为char剪辑顶部位,因此变为0x00
直接在printf
语句中,它正在寻找int
所以它不会剪辑它...