[英]Why are x and z evaluating differently if “x=(date<<7)>>12” and {y=date<<7;z=y>>12;}?
這真是令人沮喪。可能的原因是(date<<7)>>12
給出了與y>>12
不同的結果,其中y
是date<<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);
}
OUTPUT
Month is 163
Month is 3
在C語言中,所有整數計算至少提升為int
1 。 所以
x = (date << 7) >> 12
= (5225 << 7 /* result as int */) >> 12
= 668800 >> 12
= 163
計算完成后,我們將結果截斷回unsigned short
以獲得163。
在第二種情況下, y
強制將結果截斷為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:“如果int
可以表示原始類型的所有值(由寬度限制,對於位域),則該值將轉換為int
;否則,它將轉換為unsigned int
這些被稱為整數促銷 。“
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.