2010-02-21 3 views
5

PHP의 왼쪽 시프트 기능에 대해 매우 혼란 스럽습니다. 두 가지 다른 컴퓨터 (dev 및 hosting)에서 사용하고 있으며 다른 답변을 제공하고 있습니다. 나는이 계산에 아래로 추적했습니다PHP 왼쪽 시프트가 두 개의 다른 컴퓨터에서 두 개의 답변을 제공합니다.

(-3941404251) << 5;

내가 대답 -1570884448 받고 있어요 기계 하나에; 두 시스템 모두 PHP_INT_MAX = 2147483647입니다. 나중에는 32 비트 시스템이고 처음은 64 비트입니다. php는 32 비트 프로세스로 실행 중이지만 여전히 동일한 대답을 제공합니다.

나는 이것이 32 비트 대 64 비트의 문제라고 가정 할 수 있지만 원하는 동작을 얻는 쉬운 방법이 있습니다. 누군가가 저에게 기능이나 무언가를 가르키면 좋을 것입니다.

감사합니다.

+0

잘, 그 진술 앞에 에코를 두는 것은 똑같은 것을 만듭니다. (문맥은 문제가 아니다). – Brendon

+0

@Sarfraz : 그는 코드를 보여줍니다 :'(-3941404251) << 5' ;;; @ 브레드 본 : 당신이 묘사 한 것을 재현합니다 : 32 비트는 0, 64 비트는 -1570884448 –

답변

2

첫 번째 값은 문제의 정답입니다. 공식 매뉴얼에 따르면 max_int보다 큰 숫자에는 비트 연산자를 사용할 수 없다고합니다. GMP 함수 (예 : http://www.php.net/manual/en/function.gmp-and.php)를 사용하여 숫자를 문자열로 처리하십시오.

1

컴퓨터가 동일한 버전의 PHP를 실행하고 있습니까? (-3941404251)은 이미 32 비트 부호있는 값에 비해 너무 큽니다. 따라서 "올바른"결과가 정의되지 않았고 다른 버전/컴파일/다른 결과를주는 등의 결과는 버그로 간주되지 않습니다.

1

BC Math 함수를 사용하여 정수 제한을 극복 할 수 있습니다. 그것은 elq의 GMP 함수 응답에 대한 대안이며, 아마도 더 잘 지원 될 것입니다.

관련 문제