2014-07-01 3 views
0

다른 사람이 왜 아래 코드에서 두 비트 연산에 대한 출력이 다른지 설명 할 수 있습니까?
http://php.net/manual/en/language.operators.bitwise.php에서 PHP 문서에 따르면, $ 값은 정수로 캐스트해야합니다비트 연산자에 대한 형변환

피연산자와 결과는 모두를위한 < < 및 >> 사업자는 항상 정수로 처리됩니다.

내 코드 : 부호없는 정수는 지원되지 않기 때문에

$value = 4294967295; 
echo 'value is float: ' . (($value >> 32 - 1) & 1); //OUTPUT: value is string: 1 
$value = '4294967295'; 
echo 'value is string: ' . (($value >> 32 - 1) & 1); //OUTPUT: value is string: 0 

두 번째 동작 타입 캐스팅이 작동하지 않고 작업이 문자의 ASCII 값을 수행? 그렇다면 왜 float 값과 함께 작동합니까?

내 코드는 float 값과 잘 작동하므로 실제 문제는 없지만 무슨 일이 일어나는지 알고 싶습니다. 내 코드가 예상대로 작동하지 않는 곳을 알아내는 데는 시간이 걸렸습니다.

필자는 Windows 7 x64 (테스트 용)에서 5.4.19 버전의 PHP를 사용합니다.

+1

PHP 5.5.11 (cli) (빌드 : May 2014 18:13:30) OSX는 두 경우 모두'1 '을 제공합니다. – mleko

+0

PHP의 어떤 버전에서도 재현 할 수 없습니다 : http://3v4l.org/IQ1CG – deceze

+0

@deceze http://3v4l.org에서 할 수 없지만 http://ideone.com/, http://codepad.org/ 및 다른 사람들은 내 로컬 컴퓨터에있는 것과 동일한 출력을 생성합니다. –

답변

0

이것은 어떤 현상이 발생했는지에 대한 설명입니다. PHP 5.3.18, 윈도우 XP, 32 비트.

코드 :

$value = 4294967295;  // This is a 'float' 
$vint = (int) $value;  // this becomes -1 as an integer. 

// shows the types and values 
var_dump($value, $vint, dechex($vint)); 
echo 'value is float: ' . (($value >> 32 - 1) & 1); //OUTPUT: value is string: 1 

출력하십시오 "플로트는"모든 비트 인 -1을 정수로 변환된다

float 4294967295 
int -1 
string 'ffffffff' (length=8) 
value is float: 1 

참고. 따라서 시프트 될 때 결과가 출력됩니다.

지금 다른 결과를 볼 수 있습니다 :

코드 :

$value = '4294967295'; // is treated as positive? 
var_dump($value, dechex($value)); 
echo 'value is string: ' . (($value >> 32 - 1) & 1); //OUTPUT: value is string: 0 

출력 :

string '4294967295' (length=10) 
string '7fffffff' (length=8) 
value is string: 0 

여기서 흥미로운 점은 '기호'비트가 Off '이라는 것이다 '를 정수로 변환 할 때. 이것은 이동되었을 때의 출력을 설명합니다.

+0

감사합니다. 당신의 명확한 설명을 위해, @ 리안. 필자는 정수로 취급되는 피연산자에 대한 설명이 모호하다고 생각합니다. 그것은 나를 이진으로 사고하는 것에 집중하지 못하게 만들었습니다. 또한 7FFFFFFF PHP에서 가능한 가장 큰 (서명 된) int입니다 언급하고 싶습니다. $ 값의 형변환은이 값으로 제한됩니다. –