SORU
10 Temmuz 2014, PERŞEMBE


Neden int i = 1024 * 1024 * 1024 * 1024 derleme hatası olmadan mı?

int sınırı 2147483647 -2147483648.

Ben giriş

int i = 2147483648;

sonra bir de güneş Tutulması altında kırmızı çizgi sorar "2147483648".

Ama eğer bunu yaparsam:

int i = 1024 * 1024 * 1024 * 1024;

iyi bir derleme.

public class Test {
    public static void main(String[] args) {        

        int i = 2147483648;                   // error
        int j = 1024 * 1024 * 1024 * 1024;    // no error

    }
}

Belki Java temel bir soru, ama ikinci türevi hiçbir hata üretir neden hiçbir fikrim yok.

CEVAP
10 Temmuz 2014, PERŞEMBE


Bu ifade ile yanlış bir şey yok; sadece 4 Sayı çoğalıyor ve bir int atamadan sen, sadece bir taşma oluyor. Bu tek bir atama daha farklıdeğişmezsınırları kontrol derleme zamanında olurdu.,

Çizginin dışındadeğişmezbu hata, neden oluratama:

System.out.println(2147483648);        // error
System.out.println(2147483647   1);    // no error

Buna karşılık long bir edebi güzel derleme:

System.out.println(2147483648L);       // no error

Bu, aslında, sonuç unutmayınhala 1024 * 1024 * 1024 * 1024 çünkü derleme zamanı hesaplanır constant expression bir:

int i = 1024 * 1024 * 1024 * 1024;

olur:

   0: iconst_0      
   1: istore_1      

Sonuç (0) sadece yüklü ve saklı olduğuna dikkat edin, ve hiç bir çarpma gerçekleşir.


JLS §3.10.1 (@yorum hatırlattığın için ChrisK için teşekkürler):

Eğer bir ondalık 18 ** yazın değişmez 2147483648 daha büyük ise, bir derleme zamanı hatası (231eğer ondalık değişmez 2147483648 her yerde tekli eksi operatörünü (§15.15.4) işlenen dışında görünüyorsa, ya da.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Damien Hayes

    Damien Hayes

    11 Mart 2008
  • Eric Magidson

    Eric Magidso

    4 Ocak 2009
  • The10HourMan

    The10HourMan

    28 EYLÜL 2012