2011-02-11 3 views
0

2 개의 동일한 함수 (PHP와 자바 스크립트 중 하나)가 다른 결과를 반환하는 경우 이상한 결과가 나타납니다.비트 시프 팅시 PHP와 JS에서 다른 결과 얻기

코드 줄의 양의 입력은 동일하다 :

a = 4653896912; 
b = 13; 

I는 두 변수 타입을 체크 한 두 변수 PHP JS에서의 숫자 및 정수이다.

a = a >> b; 

당신은 모두 이후에 같은 값을 가지고 있지만,하는 내가 '기대 :

$a = $a >> $b; 

은 자바 스크립트가이있다 :

PHP에 대한 코드의 라인이있다 다음을 얻는 것 :

PHP: $a = 568102 
JS: a = 43814 

나는 나를 완전히 당황하게했다. 이 지점에서.


이것은 분명히 32 비트를 사용하는 64 비트 정수와 JS를 사용하는 PHP의 문제입니다. 지금 당면한 문제는이 계산을 위해 32 비트 정수를 사용하도록 PHP를 가져와야한다는 것입니다. 다른 사람이 쓴 것처럼 보이는 함수를 찾았지만, 출력이 전혀 변하지 않는 것 같습니다.

private static function toInt32(&$x) { 
    $z = hexdec(80000000); 
    $y = (int) $x; 
    if($y ==- $z && $x <- $z){ 
     $y = (int) ((-1) * $x); 
     $y = (-1) * $y; 
    } 
    $x = $y; 
} 
+0

PHP는 비트 오른쪽 시프트로 '>>'의 올바른 결과와 비슷합니다. –

+0

안녕하세요 브라이언, 정수의 크기는 플랫폼에 따라 다릅니다. PHP 매뉴얼을 보아라. http://de3.php.net/integer ... 시스템에 대한 더 많은 정보를 제공 할 수 있습니까? 32 비트? 64 비트? 브라우저 유형 및 PHP 버전? 고마워요! – BaggersIO

+0

안녕 얘들 아 모든 입력 주셔서 감사합니다, 그건 분명히 내 서버의 문제가 64 비트되고. 문제는 이제 PHP가 32 비트 정수로 제한하면서 PHP가 이러한 계산을 실행하도록하여 결과가 JS의 결과와 일치하도록해야한다는 것입니다. – Brian

답변

0

아래 코드는 계산에 사용할 하위 32 비트 만 검색하도록 숫자의 상위 32 비트를 마스킹합니다. 4294967295는 2^32 - 1입니다. 저는이 방법으로 32 비트보다 큰 모든 값을 마스크하면 PHP와 자바 스크립트에서 같은 결과를 얻을 수 있다고 생각합니다.

<?php 
    $php_a = 4653896912; 
    $php_b = 13; 

    //convert $php_a into a 32 bit val 
    $php_a = $php_a & 4294967295; 

    $a = $php_a >> $php_b; 
    echo "PHP: \$a = $a <br />"; 
?> 
<script type="text/javascript"> 
    var a = 4653896912; 
    var b = 13; 

    var a = a >> b; 
    alert('Javascript A value is ' + a); 
</script> 
+0

여러분을 사랑합니다. 너는 개가 아니야. 니가 남자 야. 그냥 그랬어 : D – Brian

+0

그루비, 듣기 좋게! –

0

4653896912는 32 비트 이상입니다. 예기치 않은 결과가 발생할 수 있습니다. PHP에 대해서는 $a = 43814을 얻지 만 실제로는 358929617 >> 13입니다. 따라서 PHP는 64 비트 연산을 수행하지만 JavaScript는 32 비트입니다.

+0

당신은 무엇을 알고 있습니다 ... 나는 그 추측을 고려하지 않았습니다. PHP가 32 비트에서 계산을 수행하여 결과가 일치하도록 만드는 방법을 찾으려고합니다. 고마워;) – Brian

+0

당신이 64 비트 브라우저를 실행하는 클라이언트 컴퓨터를 실행할 때까지. – FatherStorm

+1

ECMAScript 논리 연산은 32 비트 연산으로 정의됩니다. http://bclary.com/2004/11/07/#a-11.7을 참조하십시오. – HBP

0

당신이 a이 [PHP] [1]의 32 비트 부호있는 정수의 한계를 초과했기 때문에 그럴 것이라고 믿습니다.

가능한 최대 값은 약 2 백만이고 a은 40 억을 초과합니다.

공간 제한으로 인해 롤오버 할 때 결과를 예측할 수 없거나 적어도 파악하기가 어려울 수 있습니다.

서버가 64 비트 버전의 PHP를 사용하는 경우 서버 성능이 최대치보다 훨씬 높아지지만 최종 사용자가 실행하는 JavaScript의 수는 제한됩니다.

integers page에서 PHP를 읽을 수 있습니다.