簡體   English   中英

如果“x =(date << 7)>> 12”和{y = date << 7; z = y >> 12;},為什么x和z的評估方式不同?

[英]Why are x and z evaluating differently if “x=(date<<7)>>12” and {y=date<<7;z=y>>12;}?

這真是令人沮喪。可能的原因是(date<<7)>>12給出了與y>>12不同的結果,其中ydate<<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM