Могу ли я определить размер PHP INT до 4 байт в 64-битной системе под управлением PHP?
Я использую 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";
- PHP_INT_MAX: 2147483647
- PHP_INT_SIZE:4 байта (32 бита)
однако часть алгоритма кодирования, который я использую, зависит от того, что int имеет вышеуказанный размер (4 байта). Когда я запускаю код на сервере моего веб-хоста, это 64-разрядная система, а размер int в два раза больше.
Is есть способ заставить" (int) " использовать 32-битный размер?
например, предположим следующий код:
$test = 4170266799;
print $test;
print (int) $test;
на 32-бит вывод:
4170266799
-124700497
на 64-бит вывод:
4170266799
4170266799
можно ли заставить значение INT равняться 4 байтам, даже если архитектура изменяется с 32-разрядной на 64-разрядную?
2 ответов
нет, это очень зависит от самой платформы:
размер integer зависит от платформы, хотя максимальное значение около двух миллиардов-это обычное значение (это 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-бит