Ich bin gespannt, was passiert, wenn eine numerische Variable in Bash erhöht wird, ohne sie absichtlich anzuhalten. Wie groß kann die Zahl werden? Wird es überlaufen und negativ werden und sich für immer erhöhen? Wird es brechen und irgendwann zum Stillstand kommen?
Ich verwende einen x86_64 AMD-Prozessor, würde mich aber auch über 32-Bit-Antworten freuen. Geben Sie einfach an, um welche es sich handelt. Ich verwende Fedora21 64bit.
Ich habe weit und breit gegoogelt, aber aus irgendeinem Grund keinen bestimmten Leckerbissen gefunden. Es scheint, als wäre es eine grundlegende Information in allen Handbüchern und dergleichen.
for i in {0..70}; do echo 2 to the power of $i = $((2**i)); done
ksh
Gleitkomma-Arithmetik umschalten , nicht auf Ganzzahl-Arithmetik wiebash
:ksh -c 'echo $((2**1023))'
→8.98846567431157954e+307
Antworten:
Dies hängt möglicherweise von Ihrer Version von bash, Ihrem Betriebssystem und Ihrer CPU-Architektur ab. Warum versuchst du es nicht selbst? Setzen Sie eine Variable auf (2 ^ 31) -1, erhöhen Sie sie dann, setzen Sie sie auf 2 ^ 32, erhöhen Sie sie dann, setzen Sie sie auf 2 ^ 64, erhöhen Sie sie dann usw.
Hier habe ich es gerade selbst auf meinem Core i7 Mac unter OS X "El Capitan" v10.11.3 versucht, und es sieht so aus, als ob bash signierte 64-Bit-Ganzzahlen verwendet.
quelle
Ich habe eine Schleife aufgebaut.
while return status is 0 increment a variable with addition and print the variable to stdout
Ich habe es gerade unter 2 ^ 31 gestartet, habe es ohne Probleme 2 ^ 31 und 2 ^ 32 passieren lassen, habe es gestoppt und dann den Anfangswert auf knapp 2 ^ 63 gesetzt. Das Ergebnis war, dass es nahtlos von 9.22e18 auf -9.22e18 überging und sich weiterhin positiv erhöhte. (gegen null)Nur um zu überprüfen, ob my
while [ $? -eq 0 ]
tatsächlich den Exit-Status der Befehle in der while-Schleife verwendet, nicht den Exit-Status des vorherigen Skripts oder eine Kuriosität, habe ich es auch mit einem zusätzlichen Befehl in der Schleife ausgeführt, der einen Exit ungleich Null erstellen soll Status in bestimmten Schritten.Wenn es also signiert ist, wird ein Rollover ausgeführt, anstatt beim Maximalwert anzuhalten, und dies ohne Fehlermeldung. So ist es möglich, in einer Endlosschleife zu enden. Es beschränkt die 64-Bit-Hardware und das 64-Bit-Linux-Betriebssystem nicht auf einen alten 16- oder 32-Bit-Standard.
quelle
Bash verwenden 64-Bit-Ganzzahl. Wenn Sie also nach Erreichen der maximalen Anzahl der Variablen eine Erhöhung vornehmen, läuft die Variable über. Unten ist mein Test mit Int und Integer mit Vorzeichen.
quelle