2011-05-15 2 views
1

대 C# .NET에서 다른 결과를 얻기 내가 얻을 :비트 시프트 - 나는 PHP에서이 명령을 실행하면 PHP

Code: 2269495617392648 >> 24 
Result: 32 

나는 C# .NET 또는 vb.net에서 실행할 때, 나는 얻을 :

Code: 2269495617392648 >> 24 
Result: 135272480 

PHP가 정확합니다.

흥미로운 것은 내가 .NET에서 int32보다 큰 수를 이동하려고 할 때, 그것은 나쁜 결과를 얻을 수 있다는 것입니다 ..

int32 (2147483647)에서 모든 수는 PHP와 C#을 .NET 또는 VB에서 같은 결과를 얻을 수

.net

.net에서이 문제를 해결할 수있는 방법이 있습니까?

+0

마지막으로 C#을 사용한 지 오래되었지만 PHP가 강력하게 형식화되지 않았고 런타임시 변수 유형을 추론하므로 문제가 발생할 수 있다고 생각합니다. 필요합니다. C#에서 변수가 오버플로되고 있다고 생각합니다. 아마도 더 큰 유형을 사용하면 도움이 될 것입니다. C#에서 int64 유형이 있습니까? 그 또는 길지도 오래. –

답변

12

엄밀히 말하면, PHP가 잘못되었습니다.

2269495617392648의 전체 비트 패턴은 다음과 같습니다

1000 0001 0000 0001 1000 0010 0000 0001 1000 0001 0000 0000 1000 (2269495617392648) 

오른쪽이 24 시간을 이동하는 것은 당신에게 가져옵니다

0000 0000 0000 0000 0000 0000 1000 0001 0000 0001 1000 0010 0000 (135272480) 

135272480하지 32에 대한 비트 패턴이다.

PHP에서 무엇이 일어나고있는 것은 숫자 2269495617392648이 하위 32 비트 만 보존하여 538447880으로 잘 렸습니다. 숫자 2269495617392648은 너무 커서 부호가 있거나 부호없는 32 비트 정수에 맞지 않습니다.

잘린 비트를 24 번 오른쪽으로 시프트하면 32이됩니다.

Before truncation to 32-bits: 
1000 0001 0000 0001 1000 0010 0000 0001 1000 0001 0000 0000 1000 (2269495617392648) 

After truncation to 32-bits: 
0010 0000 0001 1000 0001 0000 0000 1000 (538447880) 

Right shifting the truncated bits by 24 bits: 
0000 0000 0000 0000 0000 0000 0010 0000 (32) 

당신이 말한 때이 문제를 언급했다 :

재미있는 것은 내가 그물에 INT32 다음 큰 숫자 이동하려고 때 나쁜 결과를 얻을 수 있다는 것입니다 ..

32 비트에 맞추기 위해 일부 비트가 잘 리기 때문에 나쁜 결과를 가져옵니다.

당신이 C 번호로 PHP에서 포팅하고이 동작을 보존 할 필요가있는 경우, 당신은 수동으로 2269495617392648 & 0xffffffff를 사용하는 대신에 단지 2269495617392648 (jcomeau_ictx's answer 참조) 비트를 잘라해야합니다. 그러나 PHP 코드에서 비트 잘림 문제가 발생한다는 것을 알아 두십시오. 의도적인지 여부는 확실하지 않습니다.

3

이동하기 전에 번호를 0xffffffff와 비트 단위 AND로 지정하십시오. 파이썬에서

:


>>> 2269495617392648 >> 24 
135272480L 
>>> (2269495617392648 & 0xffffffff) >> 24 
32L 

나는 거의 NET을 사용하지,하지만 꽤 확실 구문이 매우 유사합니다.

관련 문제