Ve výpočtu Google Toolbar PageRanku se vedle sebe provádí aritmetické i bitové operace a spoléhá se na to, že celé číslo v PHP zabere 32 bitů. To ale bohužel není pravda, protože velikost čísla je v PHP stejně jako třeba v C závislá na platformě. Na 64bitových procesorech tedy výpočty nesouhlasí a vzhledem k tomu, že v PHP nelze explicitně vytvořit proměnnou typu 32bitové číslo, je potřeba se do problematiky ponořit trochu hlouběji.
Pokud při aritmetické operaci dojde k překročení maximální velikosti 32bitového čísla, je situace poměrně jednoduchá – stačí v čísle nechat spodních 32 bitů, což se provede např. bitovým součinem s 0xFFFFFFFF
.
Horší je situace při opačném převodu, tady už potřebujeme vědět, co jednotlivé bity v čísle reprezentují. Nejdůležitější informace je, že vrchní bit reprezentuje znaménko – pokud tedy zjistíme, že je 32. bit nastaven, musíme z hodnoty vytvořit záporné číslo nastavením všech jeho bitů na pozici vyšší než 32. To můžeme provést logickým součtem s ~0xFFFFFFFF
.
<?php function arit2bit($a) { return $a & 0xFFFFFFFF; } function bit2arit($a) { return ($a & 0x80000000 ? $a | ~0xFFFFFFFF : $a); } ?>
Stejný problém má mimochodem i Google Toolbar v 64bitovém Firefoxu.
Diskuse je zrušena z důvodu spamu.