Jestem ciekawy, co się stanie, gdy zmienna numeryczna w bash zostanie zwiększona bez celowego zatrzymania. Jak duża może być liczba? Czy to się przepełni i stanie się ujemne i po prostu będzie rosło wiecznie? Czy w pewnym momencie pęknie i zatrzyma się?
Używam procesora AMD x86_64, ale chętnie usłyszę również odpowiedzi 32-bitowe, po prostu określ, o czym mówisz. Korzystam z Fedory 21 64bit.
Poszukałem daleko i szeroko, ale z jakiegoś dziwnego powodu nie znalazłem tego konkretnego smakołyka. Wygląda na to, że byłaby to podstawowa informacja we wszystkich instrukcjach i tym podobne.
for i in {0..70}; do echo 2 to the power of $i = $((2**i)); done
ksh
arytmetyki zmiennoprzecinkowe, a nie na liczby całkowite, takie jakbash
:ksh -c 'echo $((2**1023))'
→8.98846567431157954e+307
Odpowiedzi:
Może sprowadzać się do twojej wersji bash, systemu operacyjnego i architektury procesora. Dlaczego nie spróbujesz tego sam? Ustaw zmienną na (2 ^ 31) -1, następnie zwiększ ją, ustaw na 2 ^ 32, następnie zwiększ ją, ustaw na 2 ^ 64, a następnie zwiększ ją itd.
Tutaj właśnie wypróbowałem to sam na moim Core i7 Mac z systemem OS X „El Capitan” 10.11.3 i wygląda na to, że bash używa 64-bitowych liczb całkowitych ze znakiem.
źródło
Założyłem pętlę.
while return status is 0 increment a variable with addition and print the variable to stdout
Rozpocząłem tuż poniżej 2 ^ 31, pozwoliłem mu przejść bez problemu 2 ^ 31 i 2 ^ 32, zatrzymałem go, a następnie ustawiłem wartość początkową na nieco poniżej 2 ^ 63. W wyniku tego płynnie przeszedł z 9,22e18 do -9,22e18 i kontynuował wzrost. (w kierunku zera)Aby tylko sprawdzić, czy
while [ $? -eq 0 ]
faktycznie używałem statusu wyjścia poleceń w pętli while, nie używając statusu wyjścia poprzedniego skryptu lub jakiejś dziwności, uruchomiłem go również z dodatkową komendą wewnątrz pętli zaprojektowaną do utworzenia niezerowego wyjścia status przy poszczególnych przyrostach.Więc jest podpisany, przewróci się, a nie zatrzyma na maksymalnej wartości, i robi to bez żadnego komunikatu o błędzie. Możliwe jest więc, że skończy się w naprawdę nieskończonej pętli. Nie ogranicza 64-bitowego sprzętu i 64-bitowego systemu Linux do starego 16 lub 32-bitowego standardu.
źródło
bash używa 64-bitowej liczby całkowitej. Jeśli więc zwiększysz wartość po osiągnięciu maksymalnej liczby, zmienna przepełni się. Poniżej znajduje się mój test z liczbą całkowitą bez znaku i liczbą całkowitą ze znakiem.
źródło