2017-03-11 1 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. 
} 

숯불 값이 동일 할 수도 있지만, 비교는 arr1은 arr2이를 사용하여 레지스터로 이동됩니다 동안이 movzx (확장 제로를 이동)를 사용하여 레지스터로 이동됩니다 때문에 다른 걸 말할 것이다 movsx (이동 부호 확장).

이렇게하면 최상위 비트가 1 인 0x90과 같은 숫자에 문제가 발생합니다. 따라서 movsx이므로 32 비트 레지스터는 0xFFFFFF90 값을 가지며 movzx 값은 0x90이되고 cmp 명령은 달라진다고합니다.

+0

이것은 올바른 동작입니다. 문자는 C++로 int로 승격되고 부호 문자는 부호 확장됩니다. – doug

+0

@doug thanks doug – Majiick

+0

구현에 따라'char'는 부호가 있거나 부호가 없다는 것에주의하십시오. 분명히 당신의 서명이 사용됩니다. 서명되지 않은 구현을 사용하면이 문제가 발생하지 않습니다. 'char * arr1; 대신'question char * array; '를 사용하여보다 일반적인 질문을 구성하십시오. –

답변

1

좋아요, 비교할 때 모두 (char)으로 캐스팅하면됩니다.

관련 문제