2017-03-11 183 views
0

我有一個unsigned char的數組和一個只有char的數組。我想比較他們兩個,看他們是否一樣。即使比特相同,有時比較也會失敗。將無符號字符與有符號字符進行比較

我知道我可以使用memcmp(),但我只是很好奇如何手動完成它。

char* arr1; 
unsigned char* arr2; 
... 
if (arr1[i] != arr2[i]) { //move zero extend vs move sign extend 
     std::bitset<8> x(arr1[i]); 
     std::bitset<8> y(arr2[i]); 

     std::cout << x << " " << y << std::endl; //The bits are the same. 
} 

即使char值可能是相同的,比較會說,他們是不同的,因爲ARR1被搬進使用movzx(移動零擴展),而ARR2被使用移入寄存器中的寄存器movsx(移動符號擴展)。

這會導致數字問題,如0x90,其中最重要的位是一個。因此,一個movsx這樣一個32位寄存器將導致值0xFFFFFF90而movzx將導致值0x90,並且cmp指令會說他們不同。

+0

這是正確的行爲。字符在C++中被提升爲整數並且簽名字符被擴展。 – doug

+0

@doug謝謝doug – Majiick

+0

請注意,'char'可以是有符號或無符號的,具體取決於實現。顯然你使用簽名。在使用未簽名的實現中,不會出現此問題。爲了更通用地構建問題,而不是'char * arr1;'使用'signed char * array''。 –

回答

1

好吧,您只需在比較時將它們投射到(char)