Подтвердить что ты не робот

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

Есть ли способ принудительно использовать "(int)" для использования 32-битного размера?

Например, предположим следующий код:

$test = 4170266799;
print $test;                     
print (int) $test;

В моей 32-разрядной системе вывод:

4170266799
-124700497

В моей 64-разрядной системе вывод:

4170266799
4170266799

Возможно ли, чтобы значение INT составляло 4 байта, даже если архитектура изменилась с 32-разрядной до 64-разрядной?

4b9b3361

Ответ 1

Ссылка на этот вопрос на переполнение стека, я нашел решение, которое, похоже, работает в моих ранних тестах:

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);

Ответ 2

Нет, это очень сильно зависит от самой платформы:

Размер целого числа зависит от платформы, хотя максимальное значение около двух миллиардов - это обычное значение (подписали 32 бита). Обычно 64-битные платформы имеют максимальное значение около 9E18. PHP делает не поддерживают целые числа без знака.

И поскольку значения, которые выставляют целочисленный размер и целочисленный максимум, являются константами, они не могут быть изменены - определяются во время компиляции PHP на основе текущей системы.

Не много утешения, но именно поэтому, полагаясь на что-то вроде константы (которая не ваша, чтобы меняться, и может быть изменена для каждой сборки), или любые реализации "sizeof" столь же злы, как и магия номера в коде - не делайте этого. Одна вещь, на которую мы можем быть уверены (по крайней мере, я надеюсь!), состоит в том, что 4 есть и всегда будет 4, но не то, что x, y или z будут представлять 4, даже если они это сделают сейчас.