[英]C/C++: Conversion of char[] to int fails, unsigned char[] to int works, why?
我還沒有找到回答這個確切行為的問題,而且我只是不知道發生了什么:
我將Windows位圖文件(bmp)的內容讀取到一個數組中,並在以后使用此數組提取所需的信息:
char biHeader[40];
// ...
source.read(biHeader,40);
// ...
int biHeight = biHeader[8] | (biHeader[9] << 8) | (biHeader[10] << 16) | (biHeader[11] << 24);
此后, biHeight
顯示為-112
,這是完全錯誤的,因為它應該是400
。 因此,我看了一下文件的十六進制轉儲。 讀取的內容是:
90 01 00 00
將字節順序更改為big endian可以得到0x190
,即十進制的400
。
如果我將以上代碼更改為:
unsigned char biHeader[40];
// ...
source.read((char*)biHeader,40);
// ...
int biHeight = ... (same as before)
...然后我得到了期望值。 這里發生了什么?
並且:您將如何讀取這些數據?
作為有符號的8位二進制補碼整數, 0x90
是-112
。 當|
轉換為int
。 ,其值被保留。 由於如果表示形式是二進制補碼,則從第七位起的所有位都將置位,因此按位或左移至少八位的值不再更改該值。
作為一個無符號的8位整數, 0x90
值為144,是一個正數,沒有超出2^7
位設置的位。 然后,按位或biHeader[9] << 8
將值更改為所需的144 + 256 = 400
。
當使用按位運算符時,(幾乎)總是使用無符號類型,有符號類型經常導致不愉快的意外(如果移位結果超出范圍或向左移負整數,則會導致不確定的行為)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.