2009-11-15 1 views
2

일부 C 코드를 PHP로 변환하는 동안, 특히 오른쪽 시프트 연산자를 사용하여 문제가 발생했습니다.PHP가 오른쪽으로 이동하고 부정적인 결과가 나옵니까?

편집 : 다음 예제에서, 비트 = 0;

원래 C 코드 :

p->param->outBits[bytePtr++] |= codeword >> (9 + bit); 

PHP 코드 :

$outBits[$bytePtr++] |= $codeword >> (9 + $bit); 

나는 codeword이 130,728 인 C에서 나는 -1의 예상 결과를 얻을 시작합니다. PHP에서는 255가됩니다. 이것은 산술/논리 이동 차이와 관련이 있으며, 0에 머물러있는 MSB의 결과로 부정적 부호가 도입되지 않는다는 것을 이해합니다.

PHP에서 위와 같은 작업을 수행하는 "빠른"방법이 있습니까? 예를 들어 기본 산술 또는 이와 유사한 방식을 통해 예상 답변을 얻을 수 있습니까?

+0

@stereofrog, 단지 'outBits' 메모리가 숯의 부하이므로 8 비트이므로 결과의 차이가 있음을 알게되었습니다. 빠른 테스트 케이스 작성을 주셔서 감사합니다! :-) – richsage

답변

3

당신의 문제는 PHP는 타입이 byte이 아니며 보통은 integer이며 보통 32 비트 (8이 아님)입니다. 따라서 정말로 음수 값이 필요하면 (부호가 올바르지 않습니다. 부호없는 255는 부호가있는 -1과 같음), 음수 값 (255는 -1, 254는 -2, 즉 256 - x = -x)을 복원하려면 누락 된 24 개 항목을 추가하거나 산술을 사용해야합니다.

+0

그게 내가 누락되었습니다. @stereofrog에 대한 위의 내 의견을보십시오. 건배! :-) – richsage