Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> 32 bitowy int na 64 bitowym systemie, jak wymusic 32 bit inta?
Safek
post
Post #1





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 28.12.2010

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Zyx
post
Post #2





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Safek
post
Post #3





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 28.12.2010

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/smile.gif) Chodzi mi tylko o to, zeby zasymulowac taki procesor 32-bitowy phpem, aby interpretacja, jak to ladnie ujales (IMG:style_emoticons/default/smile.gif) byla taka sama a nie wiem jak, podejrzewam ze posiadasz wieksza wiedze na ten temat ode mnie i moglbys cos podpowiedziec (IMG:style_emoticons/default/smile.gif)

Ten post edytował Safek 11.05.2011, 13:14:29
Go to the top of the page
+Quote Post
Crozin
post
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Safek
post
Post #5





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 28.12.2010

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/smile.gif) )
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 20:34