Reg*_*ser 2 c bit-manipulation bit-shift
这是一个程序
#include<stdio.h>
#include<stdlib.h>
int main()
{
unsigned char a=0x80;
printf("%d\n",a<<1);
}
Run Code Online (Sandbox Code Playgroud)
上面的输出是256
现在这里是上述程序的另一个版本
#include<stdio.h>
#include<stdlib.h>
int main()
{
unsigned char a=0x80;
a=a<<1;
printf("%d\n",a);
}
Run Code Online (Sandbox Code Playgroud)
上面的输出是
0
Run Code Online (Sandbox Code Playgroud)
据我了解,我无法看到两者之间的任何差异?也就是为什么输出在第一个中输出256而在第二个程序中输出0在两个语句中的差异是什么?
Ker*_* SB 10
在您的平台上,unsigned char只有8位宽,因此a << 1当您将其分配回窄端时,将1从左端移开a.printf另一方面,在调用中,a首先将其提升为一个整数(在您的平台上比8位宽),因此该位存活.
表达式a << 1是int根据C语言的类型提升规则的类型.在第一个程序中,您正在使用它int,它现在具有该值0x100,并将其直接传递给printf(),它按预期工作.
在第二个程序中,您int被分配给a unsigned char,这会导致截断0x100为0x00.