Могу ли я определить PHP_INT_SIZE для 4 байтов в 64-битной системе с PHP? - PullRequest
15 голосов
/ 15 ноября 2011

Я использую 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-разрядную?

Ответы [ 2 ]

4 голосов
/ 15 ноября 2011

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

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);
4 голосов
/ 15 ноября 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...