特定の数値の継承は負の値を生成します。

特定の数値の継承は負の値を生成します。

これは階乗を計算する私のbashスクリプトのコードです。

read -p "Please enter the number " number
while ([ $number -gt 0 ])
do
   factorial=1
   for ((i=$number;i > 0;i--))
   do
       factorial=$((factorial * $i))
   done
   echo "The factorial of the " $number " is " $factorial
   number=$((number - 1))
done

これは{input:1}から始まるすべての数字の継承を印刷し、いくつかを除いてすべてが正しく見えます。出力は以下の通りです。 階乗を計算するコード出力

ご覧のとおり、一部の数字には負の継承があります。私はオンラインフォーラムでより大きな数の継承を計算するときにbashスクリプトがしばしば中断されることを知っていますが、オンラインで調べたところ、これらの負の値は一般的ではないようです。誰かがその理由を説明してくれれば、私の勉強に大きな助けになるでしょう。ありがとうございます!

答え1

Bash算術は符号付き64ビット整数で実行されるため、最大数は次のようになります。

$ max=$(( (1<<63) - 1 )); echo "$max"
9 223 372 036 854 775 807

これを超えると、反対の範囲、つまり負の数で始まります。

$ echo $(( $max + 1 ))
-9 223 372 036 854 775 808

これは、Cで整数オーバーフローを処理する方法とまったく同じです。

継承の場合、それは20!まだ低いですが、そうではありません。21!

関連情報