2014-07-21 92 views
5

我有一個80元素char數組,我試圖將某個元素指定爲integer,並且出現了一些數字錯誤。 十六進制中的數組元素40是0xC0。當我嘗試將它分配到一個integer我得到在十六進制0xFFFFC0,我不知道爲什麼。將字符數組中的元素轉換爲int

char tempArray[80]; //Read in from file, with element 40 as 0xC0 
int tempInt = (int)tempArray[40]; //Output as 0xFFFFC0 instead of 0x0000C0 
+10

由於在''char''中''0XC0''爲負數,並且演員將該符號保存爲''int''。 – aruisdante

+1

'int tempInt =(int)tempArray [40];' - >'unsigned tempInt =(unsigned)tempArray [40];'會做的。 – dasblinkenlight

回答

3

這是因爲char被當作符號數,並晉升爲int保留標誌。將數組從char更改爲unsigned char以避免它。

3

因爲0XC0char中爲負值,演員將該標誌保留爲int。您應該使用unsigned char如果你想保持直接二進制翻譯或作爲純粹正值

14

根據您的實現,一個char型C++是要麼一個signedunsigned類型。 (C++標準要求實現選擇任一方案)。

爲了安全起見,請在您的案例中使用unsigned char

+1

爲您投票,我忘了它可能是平臺依賴的事實。 – aruisdante

1

爲了更加方便,我總是在申報和鑄造前始終使用unsignedsigned。你可以寫:

unsigned char tempArray[80]; //Read in from file, with element 40 as 0xC0 
unsigned int tempInt = (unsigned int)tempArray[40]; //Output as 0xFFFFC0 instead of 0x0000C0 
+0

你的演員是不必要的,輸出是0xC0而不是0xFFFFC0 –

+0

這可能是。但是這種類型的轉換使代碼更具可讀性。 – milaniez

0

char可以簽署,從負char值,因此轉換會導致負int值,這是在補usualyl表示,導致非常高的二進制表示。

相反,要麼使用int tempInt = 0xFF & tempArray[40],定義tempArray如unsigned char,或澆注到unsigned charint tempInt = (unsigned char)tempArray[40](不確定如果這被定義行爲)。