Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> modulo, modulo
-_krc_-
post 17.02.2006, 17:34:06
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 17.02.2006, 18:14:14
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 biggrin.gif
[]ckd


Nie uzywaj tak wielkich liczb lub uzyj klas obslugujacych wielkie liczby.


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
-Guest-
post 17.02.2006, 18:41:43
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 17.02.2006, 18:45:18
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.


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
-Guest-
post 17.02.2006, 19:10:34
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 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 17.02.2006, 19:11:47
Post #6





Goście







ups sorx za brak tagow zapomnialem o tym, nastepnym raze bedzie ok winksmiley.jpg
Go to the top of the page
+Quote Post
dr_bonzo
post 17.02.2006, 20:22:29
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


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
_krc_
post 17.02.2006, 20:47:28
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 18.02.2006, 01:14:16
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. ?>


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
_krc_
post 18.02.2006, 08:59:52
Post #10





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

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


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
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 Wersja Lo-Fi Aktualny czas: 25.04.2024 - 10:01