Яке максимальне значення числової змінної оболонки bash?


17

Мені цікаво, що відбувається, коли числова змінна в bash збільшується, не навмисно зупиняючи її. Наскільки велике може отримати число? Чи переповниться він і стане негативним і просто продовжить наростати назавжди? Чи зламається він і в якийсь момент зупиниться?

Я використовую процесор AMD x86_64, але я радий почути 32-бітові відповіді, просто вкажіть, про що ви говорите. У мене працює 64-бітний Fedora21.

Я гуглив далеко і широко, але не знайшов цього конкретного примхи з якоїсь дивної причини. Здається, це було б базовою інформацією у всіх посібниках тощо.


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 під керуванням ОС X "El Capitan" v10.11.3, і схоже, що bash використовує підписані 64-бітні цілі числа.

$ унаме -а
Darwin Spiff.local 15.3.0 Darwin Kernel Версія 15.3.0: Чт 10 грудня 18:40:58 PST 2015; корінь: xnu-3248.30.4 ~ 1 / RELEASE_X86_64 x86_64
$ bash --версія
bash --версія
GNU bash, версія 3.2.57 (1) -випуск (x86_64-apple-darwin15)
Copyright (C) 2007 Фонд вільного програмного забезпечення, 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

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 і продовжував зростати позитивно. (до нуля)

Для того, щоб перевірити, чи мій while [ $? -eq 0 ]фактично використовував статус виходу команд у циклі while, не використовуючи статус виходу з попереднього сценарію чи якусь дивну, я також запустив його з додатковою командою всередині циклу, призначеної для створення нульового виходу статус з певними кроками.

Таким чином, він підписаний, він перевертається, а не зупиняється на максимальному значенні, і це робить без повідомлення про помилку. Так можна опинитися в справді нескінченному циклі. Це не обмежує 64-бітну апаратну та 64-бітну ОС Linux старим 16 або 32-бітним стандартом.


2

bash використовувати 64-розрядне ціле число. Тож якщо ви збільшуєтесь після досягнення змінної максимальної кількості, змінна переповнюватиметься. Нижче наводиться мій тест з непідписаним int та підписаним цілим числом.

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

2
будь ласка, додайте текст, який пояснює, як це відповідає на питання. Схоже, ви намагаєтесь продемонструвати верхні межі за допомогою коду - чи можете ви пояснити, чому цей код досягне необхідного результату?
Сер Аделаїда
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.