Мне любопытно, что происходит, когда числовая переменная в bash увеличивается без намеренной остановки. Насколько большим может быть число? Будет ли он переполнен и станет отрицательным и просто продолжит увеличиваться вечно? Это сломается и скользит к остановке в некоторый момент?
Я использую процессор x86_64 AMD, но я также был бы рад услышать 32-битные ответы, просто укажите, о чем вы говорите. Я использую Fedora21 64bit.
Я гуглил повсюду, но по какой-то странной причине не нашел этот специфический кусочек. Кажется, что это будет основная информация во всех руководствах и тому подобное.
for i in {0..70}; do echo 2 to the power of $i = $((2**i)); done
ksh
арифметику с плавающей запятой, а не на целое число, напримерbash
:ksh -c 'echo $((2**1023))'
→8.98846567431157954e+307
Ответы:
Это может быть связано с вашей версией bash, вашей ОС и архитектурой вашего процессора. Почему бы тебе не попробовать это самому? Установите переменную на (2 ^ 31) -1, затем увеличьте ее, установите на 2 ^ 32, затем увеличьте, установите на 2 ^ 64, затем увеличьте и т. Д.
Здесь я только что сам попробовал это на своем Core i7 Mac под OS X «El Capitan» v10.11.3, и похоже, что bash использует 64-битные целые числа со знаком.
источник
Я настроил петлю.
while return status is 0 increment a variable with addition and print the variable to stdout
Я запустил его чуть ниже 2 ^ 31, я пропустил и 2 ^ 31 и 2 ^ 32 без проблем, остановил его, затем установил начальное значение чуть ниже 2 ^ 63. Результатом было то, что он плавно перевернулся с 9.22e18 до -9.22e18 и продолжил увеличиваться в положительном направлении. (к нулю)Просто чтобы проверить, что my
while [ $? -eq 0 ]
фактически использовал статус выхода команд в цикле while, не используя статус выхода предыдущего скрипта или некоторую странность, я также запустил его с дополнительной командой внутри цикла, предназначенной для создания ненулевого выхода статус с определенными приращениями.Таким образом, он подписан, он будет переворачиваться, а не останавливаться на максимальном значении, и это происходит без каких-либо сообщений об ошибках. Таким образом, возможно оказаться в действительно бесконечном цикле. Он не ограничивает 64-битное оборудование и 64-битную ОС Linux старым 16 или 32-битным стандартом.
источник
bash использует 64-битное целое число Таким образом, если вы увеличите значение переменной до максимального значения, она будет переполнена. Ниже мой тест с целым числом без знака и целым числом со знаком.
источник