C 为什么x和z的评估不同,如果;x=(日期<;<;7)>&燃气轮机;12“;和{y=date<;7;z=y>;>;12;}?

C 为什么x和z的评估不同,如果;x=(日期<;<;7)>&燃气轮机;12“;和{y=date<;7;z=y>;>;12;}?,c,short,unsigned-integer,bit-shift,C,Short,Unsigned Integer,Bit Shift,这真的令人沮丧。(date12给出的结果与y>>12不同的可能原因是什么?在C中,y是date,所有整数计算都至少提升到int1。所以 1:C11§6.5.7/3:“对每个操作数执行整数提升。结果的类型是提升后的左操作数的类型。”;§6.3.1.1/2:“如果int可以表示原始类型的所有值(受位字段宽度的限制),该值将转换为整数;否则,它将转换为无符号整数。这些称为整数升级。“@Rob”ᵩ 我已将y声明为unsigned short,然后将其初始化为日期您可以这样尝试:((unsigned sh

这真的令人沮丧。
(date12
给出的结果与
y>>12
不同的可能原因是什么?在C中,
y
date,所有整数计算都至少提升到
int
1。所以


1:C11§6.5.7/3:“对每个操作数执行整数提升。结果的类型是提升后的左操作数的类型。”;§6.3.1.1/2:“如果
int
可以表示原始类型的所有值(受位字段宽度的限制),该值将转换为
整数
;否则,它将转换为
无符号整数
。这些称为整数升级。“

@Rob”ᵩ 我已将y声明为
unsigned short
,然后将其初始化为
日期您可以这样尝试:
((unsigned short)(date12
@A4L它有效。我想让你添加一行关于它为什么有效的内容。我也问过kenny,只是为了确定。好吧,我会直观地说,如果只有
date
被强制转换为
unsigned short
,由于date已经是那种类型,所以它实际上已经过时了-然后结果被再次强制转换为
int
,它具有相同的e由于根本没有强制转换,这就是肯尼解释的整数提升。所以实际上你需要的是强制转换最终结果,即
(date12
。@A4L为什么
x=(unsigned short)(date>12
解决了这个问题?@Rüppell的文化:是的。括号不会改变提升规则。
x=(unsigned short)(date>12
解决了这个问题。我凭直觉知道原因,但我想让你通过一条评论简单解释一下,只是为了确定。为什么
x=(unsigned short)(date>12
解决问题?**A4L**表示此施法无效。@Rüppell的文化:A4L表示施法无效,因为该答案仅施法
date
变量,该变量不会改变任何内容。您正在施法
(日期)的结果
#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);

}
x = (date << 7) >> 12
  = (5225 << 7 /* result as int */) >> 12
  = 668800 >> 12
  = 163
y = (unsigned short) (date << 7)
  = (unsigned short) 668800
  = 13440
z = y >> 12
  = 3