2015-03-03 59 views
0

我與CodeVisionAVR評價V2.05.0工作,其使用C編譯器Reference.I遇到了一個問題,當我嘗試這種代碼:ç位運算符

unsigned int n; 
long int data; 
data|=(1<<n); 

的問題是,當n大於15的值大的數據不會改變。雖然當我嘗試:

data|=(1<<16); 

結果是正確的。 任何幫助請求。

+0

試試這個:'data | =((long)1)<< 16' – 2015-03-03 14:13:12

+0

請發表您的其他代碼。 – Joshpbarron 2015-03-03 14:13:29

+0

是'sizeof(int)== 2'? – Matt 2015-03-03 14:14:10

回答

0

在您的代碼中,1的類型是(一如既往)int。因此,如果sizeof (int)小於sizeof (long),則說明您無法將int轉換爲long中的所有位。

溶液當然是使用(無符號)長常數:

data |= 1UL << n; 

我使它無符號因爲無符號整數更好地適用於按位運算符。文字1UL的類型是unsigned long。我發現使用後綴比鑄造更好,因爲它比方法更短並且是字面本身的一部分,而不是具有錯誤類型的字面並投射它。

許多人似乎預計,在這樣的表達式:

unsigned long long veryBig = 1 << 35; /* BAD CODE */ 

右手邊應該以某種神奇地適應左手側的「需求」,從而成爲unsigned long long型(我只是假設它至少有35位,這當然不是可移植的,但它是簡潔的)。那不會發生,C不會那樣工作。評估該表達式,然後它被轉換(如果需要的話)爲左側的類型以便分配工作。

+0

謝謝你。你是對的 – 2015-03-03 15:19:38

0

如果sizeof(int)==21<<n的類型是int。和1<<16 == 0。因此data沒有改變。

+0

16位int並不一定意味着'sizeof(int)== 2',因爲'CHAR_BIT'可以是16 – 2015-03-03 14:19:29

+0

@LưuVĩnhPhúc什麼架構?無論如何不會是'sizeof(int)<= 2'? – Matt 2015-03-03 14:34:44

+0

除C和C++標準的範圍和sizeof(char)== 1'之外,對於任何類型的大小沒有限制。在大多數架構中,你沒有看到sizeof(int)== 4'大於2嗎? http://stackoverflow.com/questions/2098149/what-platforms-have-something-other-than-8-bit-char – 2015-03-03 14:37:15

0

可能是因爲int是16位。當你使用整數文字時,編譯器可以計算出結果大於int的結果,並且將優化整個移位操作,但是當你使用一個變量時,編譯器不能這樣做,因爲它沒有知道n的價值。

0

我想感謝大家,通過你的回答我真的明白了 這是(1<<n)中的1是一個大小爲2字節的整數。 我通過讓1爲無符號long (1UL<<n)解決了這個問題。 這對我來說是第一個問題,你是很棒的傢伙。 謝謝你,我很抱歉我的英語不好。