Я использую PHP 5.3.
На моей 32-битной системе размер INT:
print "PHP_INT_MAX: " . PHP_INT_MAX . "\n"; print "PHP_INT_SIZE: " . PHP_INT_SIZE . " bytes (" . (PHP_INT_SIZE * 8) . " bits)\n";
Однако часть алгоритма кодирования, который я использую, зависит от того, что int является указанным выше размером (4 байта). Когда я запускаю код на сервере своего веб-хоста, это 64-битная система, а размер int в два раза больше.
Есть ли способ принудительно использовать «(int)» для использования 32-битного размера?
Например, предположим следующий код:
$test = 4170266799; print $test; print (int) $test;
На моей 32-битной системе выход:
4170266799 -124700497
На моей 64-битной системе вывод:
4170266799 4170266799
Можно ли заставить значение INT равным 4 байтам, даже если архитектура изменяется с 32-разрядной до 64-битной?
Нет, это очень сильно зависит от самой платформы:
Размер целого зависит от платформы, хотя максимальное значение около двух миллиардов – это обычное значение (это 32 бита). Обычно 64-битные платформы имеют максимальное значение около 9E18. PHP не поддерживает целые числа без знака.
И поскольку значения, которые выставляют целочисленный размер и целочисленный максимум, являются константами, они не могут быть изменены – определяются во время компиляции PHP на основе текущей системы.
Не так много утешения, но именно поэтому полагаться на что-то вроде константы (которая не ваша, чтобы меняться, и может быть изменена для каждой сборки), или любые реализации «sizeof» столь же злы, как и магические числа в коде – Не делайте этого. Одна вещь, на которую мы можем быть уверены (по крайней мере, я надеюсь!), состоит в том, что 4 есть и всегда будет 4, но не то, что x , y или z будут представлять 4, даже если они это сделают Теперь.
Обратившись к этому вопросу о переполнении стека, я нашел решение, которое, похоже, работает в моих ранних тестах:
function thirtyTwoBitIntval($value) { if ($value < -2147483648) { return -(-($value) & 0xFFFFFFFF); } elseif ($value > 2147483647) { return ($value & 0xFFFFFFFF); } return $value; } $test = 4170266799; print $test; print (int) $test; print thirtyTwoBitIntval($test);
И вывод на 32-битной системе:
4170266799 # $test = 4170266799 -124700497 # (int) $test -124700497 # thirtyTwoBitIntval($test);
И вывод на 64-битной системе:
4170266799 # $test = 4170266799 4170266799 # (int) $test -124700497 # thirtyTwoBitIntval($test);