Saya ingin tahu apa yang terjadi ketika variabel numerik di bash dinaikkan tanpa sengaja menghentikannya. Seberapa besar angka yang didapat? Apakah akan meluap dan menjadi negatif dan terus bertambah selamanya? Apakah akan pecah dan tergelincir berhenti di beberapa titik?
Saya menggunakan prosesor AMD x86_64, tetapi saya akan senang mendengar jawaban 32bit juga, cukup tentukan yang Anda bicarakan. Saya menjalankan Fedora21 64bit.
Saya sudah googled jauh dan luas tetapi belum menemukan berita gembira khusus ini untuk beberapa alasan aneh. Sepertinya itu akan menjadi informasi dasar dalam semua manual dan semacamnya.
for i in {0..70}; do echo 2 to the power of $i = $((2**i)); done
ksh
aritmatika floating point, bukan bilangan bulat sepertibash
:ksh -c 'echo $((2**1023))'
→8.98846567431157954e+307
Jawaban:
Mungkin turun ke versi bash, OS, dan arsitektur CPU Anda. Mengapa Anda tidak mencobanya sendiri? Setel variabel menjadi (2 ^ 31) -1, lalu tambahkan, setel ke 2 ^ 32, lalu tambahkan, setel ke 2 ^ 64, lalu tambahkan, dll.
Di sini, saya hanya mencobanya sendiri pada Core i7 Mac saya yang menjalankan OS X "El Capitan" v10.11.3, dan sepertinya bash menggunakan integer 64-bit yang sudah ditandatangani.
sumber
Saya mengatur lingkaran.
while return status is 0 increment a variable with addition and print the variable to stdout
Saya memulainya tepat di bawah 2 ^ 31, saya membiarkannya melewati 2 ^ 31 dan 2 ^ 32 tanpa masalah, menghentikannya, lalu menetapkan nilai awal menjadi di bawah 2 ^ 63. Hasilnya adalah itu berguling mulus dari 9.22e18 ke -9.22e18 dan terus meningkat secara positif. (menuju nol)Hanya untuk memeriksa apakah saya
while [ $? -eq 0 ]
benar-benar menggunakan status keluar dari perintah dalam loop sementara, tidak menggunakan status keluar dari skrip sebelumnya atau keanehan, saya juga menjalankannya dengan perintah tambahan di dalam loop yang dirancang untuk membuat jalan keluar bukan nol status pada kenaikan tertentu.Jadi itu ditandatangani, itu akan berguling bukannya berhenti pada nilai maksimal, dan ia melakukannya tanpa pesan kesalahan. Jadi dimungkinkan untuk berakhir dalam loop yang benar-benar tak terbatas. Itu tidak membatasi perangkat keras 64bit dan OS 64bit linux ke standar 16 atau 32bit lama.
sumber
bash gunakan integer 64-bit. Jadi jika Anda meningkatkan setelah variabel mencapai angka maksimalnya, variabel akan melimpah. Di bawah ini adalah tes saya dengan int unsigned dan integer yang ditandatangani.
sumber