Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: 32 bitowy int na 64 bitowym systemie
Forum PHP.pl > Forum > PHP
Safek
Witam
przegladalem forum ale takiego problemu nie znalazlem (w druga str bardziej:))

Problem jest taki:
posiadam system 64 bitowy a przez to mam rozszerzony zakres inta.
I teraz jak robie przesuniecie bitowe liczby, dajmy na to:

CODE
$zmienna = 1732584193<<5;
var_dump($zmienna);


wyswietla mi:

CODE
int(55442694176)


a powinien(dla inta 32-bitowego):
CODE
-391880672


probowalem juz ustawiac
CODE
ini_set(PHP_INT_SIZE,4);


ale to nic nie dalo, i funkcja (znalazlem w necie, typek twierdzi ze bangla)
CODE
function thirtyTwoBitIntval($value)
{
if ($value < -2147483648)
{
return -(-($value) & 0xffffffff);
}
elseif ($value > 2147483647)
{
return ($value & 0xffffffff);
}
return $value;
}


tez nie dziala poprawnie, tj ucina po prostu bity, nie interpretuje np jako liczba ujemna, a powinno...
nie mam juz sily na to, macie moze jakis pomysl?
Zyx
Operacja przesunięcia bitowego jest zaimplementowana na poziomie procesora. Nie ma czegoś takiego, jak PHP_INT_SIZE w konfiguracji PHP. Jest to stała informacyjna.

Podana przez Ciebie funkcja znaleziona w sieci jest jak najbardziej poprawna. Twoje wątpliwości wynikają z tego, że nie rozumiesz, na czym polega przesunięcie bitowe: jest to ni mniej, ni więcej, tylko ucięcie bitów. A to że na systemach 32-bitowych dać nam to może liczbę ujemną, jest czystym przypadkiem wynikającym z tego, że najstarszy bit jest bitem znaku w kodzie uzupełnień do dwóch. W systemie 64-bitowym z definicji jest on położony dalej i jest to tylko INTERPRETACJA. Pod względem bitowym operacja jest POPRAWNA.
Safek
A to to ja wiem ze jest poprawna. Wiem na czym polega przesuniecie bitow, nawet sobie recznie na kalkulatorze to robilem i wiem ze wyniki sie zgadzaja smile.gif Chodzi mi tylko o to, zeby zasymulowac taki procesor 32-bitowy phpem, aby interpretacja, jak to ladnie ujales smile.gif byla taka sama a nie wiem jak, podejrzewam ze posiadasz wieksza wiedze na ten temat ode mnie i moglbys cos podpowiedziec smile.gif
Crozin
Prawdopodobnie najlepiej będzie jak zrobisz osobno dla 32-bitowej i 64-bitowej wersji:
  1. if (PHP_INT_SIZE == 4) {
  2. $zmienna = 100000 << 12;
  3. } else {
  4. $zmienna = 100000 << 123;
  5. }
Kod będzie czytelniejszy i łatwiejszy w zrozumieniu.
Safek
stuningowalem lekko ta funkcje znaleziona w necie i wyglada teraz tak:

  1. function thirtyTwoBitIntval($value)
  2. {
  3. if ($value <= -2147483648)
  4. {
  5. $value = abs($value);
  6. $value = $value & 0xffffffff;
  7. $val_tmp = $value & 0x7fffffff;
  8. if($val_tmp != $value)
  9. {
  10. $value = ($value ^ 0xffffffff)+1;
  11. }
  12. else
  13. {
  14. return -$value;
  15. }
  16.  
  17. }
  18. elseif ($value > 2147483647)
  19. {
  20. $value = $value & 0xffffffff;
  21. $val_tmp = $value & 0x7fffffff;
  22. if($val_tmp != $value)
  23. {
  24. return ~$value = ($value ^ 0xffffffff);
  25. }else
  26. {
  27. return $value;
  28. }
  29. }
  30. return $value;
  31. }


to rozwiazalo problem (przynajmniej w wiekszosci przypadkow smile.gif)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.