2013-08-30 80 views
0

在編寫測試用例中的某些寄存器時,我遇到了這條語句。我是C++新手。對不起,如果這是一個愚蠢的問題。關於C++中的移位運算符及其優先級

base_width = 13; // assume 32 bit number 
base_width += (base_width << 6) << 5; 

考慮base_width是一個32位unsigned int,應該是什麼的base_width上述執行後的值?我嘗試了不同的編譯器,它給出了不同的結果。根據C++標準,答案是什麼,爲什麼?

+5

你得到了什麼,當你* *跑這(和什麼** **類型爲'base_width'它如果它是一個8位的無符號字符,你會得到零,如果它是一個*符號*整型,如果你轉移到符號位,你會得到未定義的行爲,但是從8位到16位起始值爲13,現在有點不相關)。請更多的代碼和上下文。 – WhozCraig

+2

你得到了什麼結果,以及什麼編譯器? – user4815162342

+1

請注意'(base_width << 6)<< 5'與'base_width << 11'相同。這是很好的定義,如果你在不同的編譯器上得到不同的結果,那麼可能還有別的東西你沒有告訴我們。 –

回答

0

想想二進制的轉變:

base_width = 13; // 1101 (base 2) 

(base_width << 6) // 1101000000 (base 2) 

(base_width << 6) << 5 // 110100000000000 (base 2) = 26624 

結果:

base_width += (base_width << 6) << 5; // 13 + 26624 = 26637 
2

讓我們簡化:

base_width = 13; // assume 32 bit number 
base_width += (base_width << 6) << 5; 

base_width = 13 + ((13 << 6) << 5); 

base_width = 13 + (832 << 5); 

base_width = 13 + 26624; 

base_width = 26637; 

對於base_width是26637.最終結果根據標準的符合標準的實現,至少。

如果你在不同的編譯器上得到不同的結果,那麼a)編譯器是垃圾(不太可能),或者b)你的代碼與你發佈的代碼不同(更可能)。