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指令會說他們不同。
這是正確的行爲。字符在C++中被提升爲整數並且簽名字符被擴展。 – doug
@doug謝謝doug – Majiick
請注意,'char'可以是有符號或無符號的,具體取決於實現。顯然你使用簽名。在使用未簽名的實現中,不會出現此問題。爲了更通用地構建問題,而不是'char * arr1;'使用'signed char * array''。 –