2

真是令人沮丧。给出与where is(date<<7)>>12不同的结果的可能原因是什么?我应该补充一点,后者按我的意图正常工作,但第一个不是。有什么区别?我看不到。y>>12ydate<<7

#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);

}

输出

Month is 163

Month is 3

4

1 回答 1

7

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

x = (date << 7) >> 12
  = (5225 << 7 /* result as int */) >> 12
  = 668800 >> 12
  = 163

计算完成后,我们将结果截断回 anunsigned short得到 163。

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

y = (unsigned short) (date << 7)
  = (unsigned short) 668800
  = 13440
z = y >> 12
  = 3

1:C11 §6.5.7/3:“整数提升在每个操作数上执行。结果的类型是提升的左操作数的类型。”;§6.3.1.1/2:“如果 anint可以表示原始类型的所有值(受宽度限制,对于位域),则将值转换为int; 否则,将其转换为unsigned int。这些被称为整数促销。”

于 2013-05-10T15:01:07.120 回答