Giriş
Sorun tamsayı taşmasıdır. Eğer taşarsa minimum değere geri döner ve oradan devam eder. Altından taşarsa maksimum değere geri döner ve oradan devam eder. Aşağıdaki resim bir Kilometre sayacına aittir. Bunu taşmaları açıklamak için kullanıyorum. Bu mekanik bir taşma ama yine de iyi bir örnek.
Bir Kilometre Sayacında, bu max digit = 9
yüzden maksimum araçların ötesine geçen 9 + 1
ve a'yı taşıyan ve veren 0
; Bununla birlikte, a'ya değiştirilecek daha yüksek bir basamak yoktur 1
, bu nedenle sayaç, olarak sıfırlanır zero
. Şimdi aklınıza "tam sayı taşmaları" fikri geliyor.
İnt türünün en büyük ondalık değişmez değeri 2147483647'dir (2 31 -1). 0'dan 2147483647'ye kadar olan tüm ondalık değişmez değerler, bir int değişmezinin görünebileceği herhangi bir yerde görünebilir, ancak değişmez 2147483648 yalnızca tekli olumsuzlama operatörünün işleneni olarak görünebilir.
Bir tamsayı toplama taşması durumunda, sonuç, yeterince büyük bir ikinin tamamlayıcı biçiminde temsil edildiği gibi matematiksel toplamın düşük sıralı bitleridir. Taşma meydana gelirse, sonucun işareti iki işlenen değerin matematiksel toplamının işareti ile aynı değildir.
Böylece 2147483647 + 1
taşar ve etrafına sarılır -2147483648
. Dolayısıyla int i=2147483647 + 1
, eşit olmayan taşmış olur 2147483648
. Ayrıca, "her zaman 0 yazdırır" diyorsunuz. Değil, çünkü http://ideone.com/WHrQIW . Aşağıda, bu 8 sayı, döndüğü ve taştığı noktayı göstermektedir. Daha sonra 0s yazdırmaya başlar. Ayrıca, ne kadar hızlı hesapladığına şaşırmayın, bugünün makineleri hızlı.
268435456
536870912
1073741824
-2147483648
0
0
0
0
Neden tam sayı taşması "etrafını sarar"?
Orijinal PDF