位移不同导致类似的程序

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位宽),因此该位存活.


JSB*_*ոգչ 5

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

在第二个程序中,您int被分配给a unsigned char,这会导致截断0x1000x00.