簡體   English   中英

C / C ++:將char []轉換為int失敗,將unsigned char []轉換為int可行,為什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM