char buffer_b[5] = { 0xDA, 0x00, 0x04, 0x00, 0x07 };
printf("%d\n%d\n%d", buffer_b[0], buffer_b[2], buffer_b[4]);
這給了我輸出:爲什麼這個十六進制值作爲負數輸出?
-38
4
7
但是我期待:
218
4
7
感謝。
char buffer_b[5] = { 0xDA, 0x00, 0x04, 0x00, 0x07 };
printf("%d\n%d\n%d", buffer_b[0], buffer_b[2], buffer_b[4]);
這給了我輸出:爲什麼這個十六進制值作爲負數輸出?
-38
4
7
但是我期待:
218
4
7
感謝。
char被簽名。使用無符號字符。
也使用%ud。
顯然,char
已在您的環境中籤名。 (這是一個細節,可以從一個實現到下一個不同,有些編譯器甚至可以通過命令行開關爲您提供一個選項。)您打印的數字是0xDA,它具有最重要的位設置,因此它的值是負面的。當編譯器將該值傳遞給printf
時,它會將(signed)char值提升爲int
,並保留其消極性。您使用了%d
格式字符串,它告訴printf
將其參數解釋爲有符號值。
要將該值作爲無符號值處理,至少應使用%u
格式字符串。然後,將陣列的元素類型更改爲無符號類型,例如unsigned char
或uint8_t
,或者將printf
參數鍵入unsigned
。
我有時會屏蔽該值以確保轉換爲'unsigned'不會首先擴展,即'buffer_b [0]&0xff'。 – 2010-04-23 16:28:03
當char
0xDA
提升爲int
傳遞給printf
,編譯器正在做一個符號擴展,將其轉換爲0xffffffda
,這是-38
的32位表示。你期待它被零延伸到0x000000da
。要控制編譯器如何擴展字符,請將其聲明爲signed char
或unsigned char
。有符號整數類型通過符號擴展進行擴展,無符號整數類型通過零擴展進行擴展。
您無法預測任何特定的編譯器如何處理不合格的char
,或者它是否與下一版本的編譯器相同。
'char'並不總是被簽名。如果它很重要,你應該明確的方式(使用'signed'或'unsigned')。或者,更好的是使用'uint8_t'。 – 2010-04-23 16:07:33
謝謝(無符號字符)buffer_b [0]的作品。 – user318747 2010-04-23 16:28:41
不要強制使用緩衝區類型,只需使其無符號即可。 – 2010-04-23 17:49:16