엄밀히 말하면, 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 코드에서 비트 잘림 문제가 발생한다는 것을 알아 두십시오. 의도적인지 여부는 확실하지 않습니다.
마지막으로 C#을 사용한 지 오래되었지만 PHP가 강력하게 형식화되지 않았고 런타임시 변수 유형을 추론하므로 문제가 발생할 수 있다고 생각합니다. 필요합니다. C#에서 변수가 오버플로되고 있다고 생각합니다. 아마도 더 큰 유형을 사용하면 도움이 될 것입니다. C#에서 int64 유형이 있습니까? 그 또는 길지도 오래. –