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命令はそれらが異なっていると言います。
これは正しい動作です。 charはint型にC++で昇格され、符号付き文字は符号拡張されます。 – doug
@dougありがとうございました – Majiick
'char'は、実装によっては、署名されても署名されなくてもよいことに注意してください。どうやら、あなたの署名付きを使用しています。符号なしを使用する実装では、この問題は発生しません。 'char * arr1;の代わりに、より包括的に質問を枠に入れるには' signed char * array; 'を使います。 –