Каково максимальное значение числовой переменной оболочки bash?

17

Мне любопытно, что происходит, когда числовая переменная в bash увеличивается без намеренной остановки. Насколько большим может быть число? Будет ли он переполнен и станет отрицательным и просто продолжит увеличиваться вечно? Это сломается и скользит к остановке в некоторый момент?

Я использую процессор x86_64 AMD, но я также был бы рад услышать 32-битные ответы, просто укажите, о чем вы говорите. Я использую Fedora21 64bit.

Я гуглил повсюду, но по какой-то странной причине не нашел этот специфический кусочек. Кажется, что это будет основная информация во всех руководствах и тому подобное.

Максимальная мощь
источник
3
Как насчет распечатки некоторых степеней 2 в качестве стартера:for i in {0..70}; do echo 2 to the power of $i = $((2**i)); done
mpy
1
Если вы хотите большие числа, вы можете переключиться на kshарифметику с плавающей запятой, а не на целое число, например bash: ksh -c 'echo $((2**1023))'8.98846567431157954e+307
jlliagre
Я буду помнить ksh, если мне понадобится плавающая точка или значения в стратосфере, плавающая точка может быть весьма полезна. Но этот вопрос просто для того, чтобы я знал пределы своей системы, а не потому, что мне нужно превышать ее пределы. Я сделаю что-то вроде того, что предлагает mpy, я не начал с того, что не хотел рисковать, вызывая сбой системы.
Макс. Мощность

Ответы:

22

Это может быть связано с вашей версией bash, вашей ОС и архитектурой вашего процессора. Почему бы тебе не попробовать это самому? Установите переменную на (2 ^ 31) -1, затем увеличьте ее, установите на 2 ^ 32, затем увеличьте, установите на 2 ^ 64, затем увеличьте и т. Д.

Здесь я только что сам попробовал это на своем Core i7 Mac под OS X «El Capitan» v10.11.3, и похоже, что bash использует 64-битные целые числа со знаком.

$ uname -a
Darwin Spiff.local 15.3.0 Darwin Kernel Версия 15.3.0: Четверг, 10 18:40:58 PST 2015; root: xnu-3248.30.4 ~ 1 / RELEASE_X86_64 x86_64
$ bash - версия
Баш - версия
GNU bash, версия 3.2.57 (1) -релиз (x86_64-apple-darwin15)
Copyright (C) 2007 Free Software Foundation, Inc.
$
$ ((X = 2 ** 16)); эхо $ X
65536 <- хорошо, хотя бы UInt16
$ ((X = 2 ** 32)); эхо $ X
4294967296 <- хорошо, хотя бы UInt32
$ ((X = 2 ** 64)); эхо $ X
0 <- упс, не UInt64
$ ((X = (2 ** 63) -1)); эхо $ X
9223372036854775807 <- хорошо, хотя бы SInt64
$ ((X ++)); эхо $ X
-9223372036854775808 <- переполнен и обернут отрицательным. Должен быть SInt64
Spiff
источник
3

Я настроил петлю. 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-битным стандартом.

Максимальная мощь
источник
2

bash использует 64-битное целое число Таким образом, если вы увеличите значение переменной до максимального значения, она будет переполнена. Ниже мой тест с целым числом без знака и целым числом со знаком.

MAX_UINT = 18446744073709551615
MAX_INT = 9223372036854775807

$ printf "%llu\n" $((2**64))
0
$ printf "%llu\n" $((2**64-1))
18446744073709551615

$ printf "%lld\n" $((2**63-1))
9223372036854775807
$ printf "%lld\n" $((2**63))
-9223372036854775808
$ printf "%lld\n" $((2**64-1))
-1
PT Huynh
источник
2
пожалуйста, добавьте текст, объясняющий, как это отвечает на вопрос. Похоже, вы пытаетесь продемонстрировать верхние пределы с помощью кода - можете ли вы объяснить, почему этот код достигнет требуемого результата?
Сэр Аделаида,