如果"x =(date << 7)>> 12"和{y = date << 7; z = y >> 12;},为什么x和z的评估方式不同?

Rüp*_*ure 2 c short bit-shift unsigned-integer

这实在是frustrating.What的是,可能的原因(date<<7)>>12是给来自不同的结果y>>12,其中ydate<<7?.我要补充一点,因为我打算后工作正常,但首先是not.What区别?我看没有.

#include<stdio.h>

int main()
{
unsigned short date=5225,x,y,z;
x=(date<<7)>>12;
printf("Month is %hu\n",x);
y=date<<7;
z=y>>12;
printf("Month is %hu\n",z);

}
Run Code Online (Sandbox Code Playgroud)

OUTPUT

Month is 163

Month is 3

ken*_*ytm 7

在C中,所有整数计算都被提升为至少int1.所以

x = (date << 7) >> 12
  = (5225 << 7 /* result as int */) >> 12
  = 668800 >> 12
  = 163
Run Code Online (Sandbox Code Playgroud)

计算完成后,我们将结果截断为a unsigned short得到163.

在第二种情况下,y强制将结果截断为a unsigned short,所以

y = (unsigned short) (date << 7)
  = (unsigned short) 668800
  = 13440
z = y >> 12
  = 3
Run Code Online (Sandbox Code Playgroud)

1:C11§6.5.7/ 3:"对每个操作数执行整数提升.结果的类型是提升的左操作数的类型."; §6.3.1.1/ 2:"如果一个intcan表示原始类型的所有值(由宽度限制,对于一个位字段),该值将转换为a int;否则,它将转换为a unsigned int.这些被称为该整数促销活动 ".