我與CodeVisionAVR評價V2.05.0工作,其使用C編譯器Reference.I遇到了一個問題,當我嘗試這種代碼:ç位運算符
unsigned int n;
long int data;
data|=(1<<n);
的問題是,當n大於15的值大的數據不會改變。雖然當我嘗試:
data|=(1<<16);
結果是正確的。 任何幫助請求。
我與CodeVisionAVR評價V2.05.0工作,其使用C編譯器Reference.I遇到了一個問題,當我嘗試這種代碼:ç位運算符
unsigned int n;
long int data;
data|=(1<<n);
的問題是,當n大於15的值大的數據不會改變。雖然當我嘗試:
data|=(1<<16);
結果是正確的。 任何幫助請求。
在您的代碼中,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不會那樣工作。評估該表達式,然後它被轉換(如果需要的話)爲左側的類型以便分配工作。
謝謝你。你是對的 – 2015-03-03 15:19:38
如果sizeof(int)==2
則1<<n
的類型是int
。和1<<16 == 0
。因此data
沒有改變。
16位int並不一定意味着'sizeof(int)== 2',因爲'CHAR_BIT'可以是16 – 2015-03-03 14:19:29
@LưuVĩnhPhúc什麼架構?無論如何不會是'sizeof(int)<= 2'? – Matt 2015-03-03 14:34:44
除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
可能是因爲int
是16位。當你使用整數文字時,編譯器可以計算出結果大於int
的結果,並且將優化整個移位操作,但是當你使用一個變量時,編譯器不能這樣做,因爲它沒有知道n
的價值。
我想感謝大家,通過你的回答我真的明白了 這是(1<<n)
中的1是一個大小爲2字節的整數。 我通過讓1爲無符號long (1UL<<n)
解決了這個問題。 這對我來說是第一個問題,你是很棒的傢伙。 謝謝你,我很抱歉我的英語不好。
試試這個:'data | =((long)1)<< 16' – 2015-03-03 14:13:12
請發表您的其他代碼。 – Joshpbarron 2015-03-03 14:13:29
是'sizeof(int)== 2'? – Matt 2015-03-03 14:14:10