2010-04-23 86 views

回答

8

char被簽名。使用無符號字符。

也使用%ud。

+10

'char'並不總是被簽名。如果它很重要,你應該明確的方式(使用'signed'或'unsigned')。或者,更好的是使用'uint8_t'。 – 2010-04-23 16:07:33

+0

謝謝(無符號字符)buffer_b [0]的作品。 – user318747 2010-04-23 16:28:41

+3

不要強制使用緩衝區類型,只需使其無符號即可。 – 2010-04-23 17:49:16

8

顯然,char已在您的環境中籤名。 (這是一個細節,可以從一個實現到下一個不同,有些編譯器甚至可以通過命令行開關爲您提供一個選項。)您打印的數字是0xDA,它具有最重要的位設置,因此它的值是負面的。當編譯器將該值傳遞給printf時,它會將(signed)char值提升爲int,並保留其消極性。您使用了%d格式字符串,它告訴printf將其參數解釋爲有符號值。

要將該值作爲無符號值處理,至少應使用%u格式字符串。然後,將陣列的元素類型更改爲無符號類型,例如unsigned charuint8_t,或者將printf參數鍵入unsigned

+2

我有時會屏蔽該值以確保轉換爲'unsigned'不會首先擴展,即'buffer_b [0]&0xff'。 – 2010-04-23 16:28:03

2

char0xDA提升爲int傳遞給printf,編譯器正在做一個符號擴展,將其轉換爲0xffffffda,這是-38的32位表示。你期待它被零延伸到0x000000da。要控制編譯器如何擴展字符,請將其聲明爲signed charunsigned char。有符號整數類型通過符號擴展進行擴展,無符號整數類型通過零擴展進行擴展。

您無法預測任何特定的編譯器如何處理不合格的char,或者它是否與下一版本的編譯器相同。

相關問題