2015-02-03 6 views
4

1539 | 0xfffff800 작업은 JavaScript 및 Python 2.7에서 -509을 반환합니다. PHP에서 나는 4294966787이됩니다.PHP 비트 연산에서 예기치 않은 결과가 발생했습니다.

아무도 이유를 알지 못해 설명 할 수 있습니다. PHP에서 예상되는 결과를 얻는 방법을 알고 싶습니다.

+0

** 전체 ** 코드를 표시하십시오. 이 결과를 얻으십시오! – Rizier123

+7

PHP는 64 비트 정수를 사용하고 있습니다. 그처럼 간단합니다. –

+0

대단히 감사합니다. 1539 | 0xfffffffffffff800은 완벽하게 작동합니다. – gsirin

답변

1

1539 | 0xfffff800 = 4294966787 (= 0xFFFFFE03) 이것은 완벽합니다. PHP가 옳습니다.

양수 및 음수를 모두 사용하려면 숫자가 음수인지 여부를 확인하는 메커니즘이 필요합니다. 이것은 대개 2의 보수를 사용하여 수행됩니다. 번호의 모든 비트를 반전시킨 다음 1을 더하면 숫자를 무효화 할 수 있습니다. 모호성을 피하기 위해 정수 변수의 모든 비트를 사용할 수 없습니다. 이 경우 가장 높은 비트를 사용할 수 없습니다. 최상위 비트는 부호 비트로 예약됩니다. 숫자가 큰 양수인지 음수인지는 알 수 없습니다.

8 비트 정수 변수가있는 exammple의 경우 0에서 255 사이의 숫자를 나타낼 수 있습니다. 부호있는 값이 필요하면 -128 (1000000 바이너리)에서 +127 (0111 1111)까지의 숫자를 나타낼 수 있습니다.

예제에서 가장 높은 비트가 설정된 32 비트 숫자가 있습니다. 파이썬과 자바 스크립트에서는 음수로 해석됩니다. 분명히 32 비트 변수를 가지기 때문에 가장 높은 비트가 설정됩니다. 그들은 그것을 음수로 해석합니다. 따라서 계산 결과도 부정적입니다. 사용중인 PHP 버전에서 정수 변수는 64 비트 길이이고 하위 32 비트 만 사용됩니다. 가장 높은 비트 (비트 63)는 설정되지 않으므로 PHP는이 숫자를 양수로 해석합니다. 달성하고자하는 것에 따라 비트 32에서 비트 63까지의 모든 비트를 1로 채워서 음수를 생성 할 수 있습니다 ...

관련 문제