Могу ли я определить размер 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-бит