Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> modulo, modulo
-_krc_-
post
Post #1





Goście







  1. <?php
  2. $z = 0xFFFFFFFF;
  3. $k = $z % 0x525549DB;
  4. echo sprintf("%X", $k);
  5. ?>


Wierzcie lub nie ale wyswietla mi wynik "FFFFFFFF". Nie mam kompletnie pojecia co jest nie tak.. moze jakies typy zmiennych trzeba ustawiac.. help!

----------
Prosze uzywac [ php ] dla kodu php
-- dr_bonzo
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


No i dziala dobrze. Haha, dlaczego? :

Bo max wartosc dla inta to 2mld (dokladnie to 2147483647 -- http://pl.php.net/manual/en/language.types.integer.php)

Tworzac inta poprzez
$z = 0xFFFFFFFF;
przypisujesz mu wartosc -1 (patrz system U2 -- http://pl.wikipedia.org/wiki/Kod_uzupełnień_do_dwóch ), bo int w php jest znakowany -- 32 bity na inta daja ci zakres od -2147483648 do +2147483647.

Dla 4mld php skonwertuje inta do floata, ale konwwertujac go recznie do inta otrzymujesz "oczekiwane" -1:
  1. <?php
  2. $z = 0xFFFFFFFF;
  3. var_dump( $z ); // float(4mld) -- traktowany jako liczba bez znaku
  4. $aa = intval( $z );
  5. var_dump( $aa ); // int (-1)
  6.  
  7. ?>


% modulo stosuje sie dla liczb calkowitych, czyli php skonwertuje oba skladniki do integera przed obliczeniem modulo
0xFFFFFFFF --> -1
0x525549DB --> 1381321179

i wykonujesz dzielenie modulo:
-1 % 1381321179
iloraz = 0, reszta -1
-1 w zapisie HEX to oczywiscie.... 0xFFFFFFFF (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
[]ckd


Nie uzywaj tak wielkich liczb lub uzyj klas obslugujacych wielkie liczby.
Go to the top of the page
+Quote Post
-Guest-
post
Post #3





Goście







dzieki za wyjasnienie, niestety duzych liczb nie moge uzyc, bo w kodzie wystepuje mnozenie ograniczone wynikiem do dworda a przy duzych liczbach juz te wyniki beda inne wiec tutaj jakby wybieram mniejsze zlo i prubuje cos zrobic z tym modulusem...
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


Chodzilo mi o cos takiego:
http://pear.php.net/package/Math_Integer
"The class Math_Integer can represent integers bigger than the
signed longs that are the default of php"

Moze pokaz wiekszy kawalek kodu.
Go to the top of the page
+Quote Post
-Guest-
post
Post #5





Goście







ok tutaj jest kawalek kodu w asm (oryginal pisany w delphi):

Kod
   
mov     eax, 0FFFFFFFFh            
mov     ebx, 525549DBh
xor     edx, edx
div     ebx                            
mov     ebx, edx


i poprostu chcialem to przetlumaczyc na php (skoro byl pisany w delphi to chyba powinno sie dac):

  1. <?php
  2. $z = 0xFFFFFFFF;
  3. $k = $z % 0x525549DB;
  4. ?>


niestety kodu w delphi nie mam tylko listing w asmie i nie wiem czy delfinek tez dal by mi -1 w takim przypadku.. troche dziwnyy problem ale nie lubie zyc w niewiedzy (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

wiec mowisz ze nie ma innego wyjscia jak uzycie tej klasy bo ciekaw jestem czy da sie to normalnie rozkminic
Go to the top of the page
+Quote Post
-_krc_-
post
Post #6





Goście







ups sorx za brak tagow zapomnialem o tym, nastepnym raze bedzie ok (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #7





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


Zarejestruj sie -- temat zostanie przeniesiony do innego dzialu w ktorym nie bedziesz mogl pisac jako gosc.


Przeniesione --> Inne > Komputery i oprogramowanie
Go to the top of the page
+Quote Post
_krc_
post
Post #8





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 17.02.2006

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


ok temat mozna juz przeniesc..
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #9





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


Ha!

  1. <?php
  2. function longIntModulo( $dividend, $divisor )
  3. {
  4. $quotient = floor( $dividend / $divisor );
  5. $remainder = $dividend - ( $quotient * $divisor );
  6.  
  7. return $remainder;
  8. }
  9.  
  10. $eax = 0xFFFFFFFF;
  11. $ebx = 0x525549DB;
  12.  
  13. $x = longIntModulo( $eax, $ebx );
  14.  
  15. var_dump( $x );
  16. ?>
Go to the top of the page
+Quote Post
_krc_
post
Post #10





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 17.02.2006

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


ehh (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) od dzisiaj jestes moim osobistym guru (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
tez probowalem w ten sposob ale zapomnialem o funkcji floor, dlatego dostawalem caly czas zwykle wyniki, ku mojemu zdziwieniu (IMG:http://forum.php.pl/style_emoticons/default/dry.gif)

dzieki rowniez za link do pear, juz czuje ze sie przyda (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 17.09.2025 - 22:55