Rüp*_*ure 2 c short bit-shift unsigned-integer
这实在是frustrating.What的是,可能的原因(date<<7)>>12是给来自不同的结果y>>12,其中y是date<<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
在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.这些被称为该整数促销活动 ".