我需要幫助解決這個問題,所以如果有人有類似的問題,它會幫助我。
這是我的代碼:
char c=0xAB;
printf("01:%x\n", c<<2);
printf("02:%x\n", c<<=2);
printf("03:%x\n", c<<=2);
為什么程式列印:
01:fffffeac
02:ffffffac
03:ffffffb0
我期望列印的,即我在紙上得到的是:
01:fffffeac
02:fffffeac
03:fffffab0
我顯然意識到我不知道接線員<<=在做什么,我想c = c << 2。
如果有人能澄清這一點,我將不勝感激。
uj5u.com熱心網友回復:
你認為是正確的
c <<= 2
相當于
c = c << 2
但是你必須記住這c是一個單位元組(在幾乎所有系統上),它只能包含 8 位,而像這樣的值0xeac需要 12 位。
當該值0xeac被分配回時,c該值將被截斷并且最高位將被簡單地忽略,留下您0xac(當提升為 anint時0xffffffac)。
uj5u.com熱心網友回復:
<<=意味著轉移和分配。它是 的復合賦值版本c = c << 2;。
這里有幾個問題:
char c=0xAB;不能保證給出肯定的結果,因為char可能是 8 位有符號型別。請參閱默認情況下字符是有符號還是無符號?. 在這種情況下,0xAB將以實作定義的方式轉換為負數。通過uint8_t在處理原始二進制位元組時始終使用來避免此錯誤。c<<2受隱式型別提升規則的約束- 特別是c將被提升為已簽名的int. 如果上一個問題發生在您char獲得負值的地方,c現在則為負值int。在 C 中左移負值會呼叫未定義的行為 - 它始終是一個錯誤。一般來說,移動有符號運算元幾乎永遠不會正確。
%x不是一個合適的格式說明符來列印int你最終得到的,也不適合char.
至于如何修復代碼,這取決于您希望實作的目標。建議uint32在轉換之前投射到。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/348680.html
下一篇:無法弄清楚如何檢查C代碼中的值
