Могу ли я определить 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-битной?

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

Размер целого зависит от платформы, хотя максимальное значение около двух миллиардов – это обычное значение (это 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);