Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: modulo
Forum PHP.pl > Inne > Komputery i oprogramowanie
_krc_
  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
dr_bonzo
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 biggrin.gif
[]ckd


Nie uzywaj tak wielkich liczb lub uzyj klas obslugujacych wielkie liczby.
Guest
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...
dr_bonzo
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.
Guest
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 tongue.gif

wiec mowisz ze nie ma innego wyjscia jak uzycie tej klasy bo ciekaw jestem czy da sie to normalnie rozkminic
_krc_
ups sorx za brak tagow zapomnialem o tym, nastepnym raze bedzie ok winksmiley.jpg
dr_bonzo
Zarejestruj sie -- temat zostanie przeniesiony do innego dzialu w ktorym nie bedziesz mogl pisac jako gosc.


Przeniesione --> Inne > Komputery i oprogramowanie
_krc_
ok temat mozna juz przeniesc..
dr_bonzo
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. ?>
_krc_
ehh winksmiley.jpg od dzisiaj jestes moim osobistym guru tongue.gif
tez probowalem w ten sposob ale zapomnialem o funkcji floor, dlatego dostawalem caly czas zwykle wyniki, ku mojemu zdziwieniu dry.gif

dzieki rowniez za link do pear, juz czuje ze sie przyda winksmiley.jpg
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.