2017-03-11 16 views
0

私はunsigned 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はARR2を使用してレジスタに移動しますながらmovzx(延長ゼロを移動)を使用して、レジスタに移動しますので、彼らは別のだと言うだろうmovsx(移動標識延長)。

これは、最上位ビットが1である0x90などの数字に問題を引き起こします。したがって、movsxのように32ビットのレジスタは0xFFFFFF90の値を返し、の値は0x90になり、cmp命令はそれらが異なっていると言います。

+0

これは正しい動作です。 charはint型にC++で昇格され、符号付き文字は符号拡張されます。 – doug

+0

@dougありがとうございました – Majiick

+0

'char'は、実装によっては、署名されても署名されなくてもよいことに注意してください。どうやら、あなたの署名付きを使用しています。符号なしを使用する実装では、この問題は発生しません。 'char * arr1;の代わりに、より包括的に質問を枠に入れるには' signed char * array; 'を使います。 –

答えて

1

いいえ、比較するときは、両方とも(char)にキャストするだけです。

関連する問題