2016-03-25 11 views
12
System.out.println((byte) (1.0/0)); 
    System.out.println((short) (1.0/0)); 
    System.out.println((int) (1.0/0)); 
    System.out.println((long) (1.0/0)); 

sonucudur:Tam sayıları tamsayıya göre tamsayı ilkellerine dönüştürmek neden farklı sonuçlar verir?

-1 
    -1 
    2147483647 
    9223372036854775807 

ikili biçimi:

1111 1111 
    1111 1111 1111 1111 
    0111 1111 1111 1111 1111 1111 1111 1111 
    0111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 

döküm sonsuzluk int ve setler biti "1 oturum sırasında uzun tamsayılar, "0" olarak biraz imzalamak tutar Neden "Bayt ve kısa tamsayılar için?

+3

Bir "int" ve sonra bir "byte" için döküm olduğunu varsayalım Not: Integer.MAX_VALUE, bir "int" için Infinity değerine en yakın değerdir. –

+0

Thx Peter, ancak Integer.MAX_VALUE değerini 'uzun' a çevirmek bize sadece '2147483647L' verir mi? –

+0

@PeterLawrey '(1.0/0)' ın 'double' olarak değerlendirilebilmesi mümkün olmazdı ve daha sonra da baytlık klavyenin 8 bitini dikkate alması mümkün değil miydi? IEEE 754, "double" ve "float" standartlarını tanımlarken, "int" için işaret bitinin 0 olduğunu garip buluyorum çünkü dokümanlar int için sonsuzluk özelliklerini tanımlamıyor. –

cevap

10

JLS 5.1.3:

tamamlayıcı tipi T bir kayan nokta sayısının bir daralma dönüşümü iki aşamada: İlk adımda

, kayan nokta sayısı uzun ya dönüştürülür T uzunsa veya bir int ise, T bayt, kısa, char veya int ise

Kayan nokta sayısı NaN (§4.2.3) ise, sonuç conver'in ilk adımı kayan nokta sayısı kayan nokta değeri IEEE 754 yuvarlak işaretine doğru kullanılarak sıfır doğru yuvarlanması, bir tamsayı değeri V yuvarlanır, bir sonsuz değilse sion, 0

Aksi halde, int veya uzun sıfır modu (§4.2.3). Daha sonra iki durum vardır: T uzunluğunda ve bu tamsayı değeri, uzun olarak temsil edilebilir, bu tam sayı ise

, daha sonra birinci aşamanın sonucu, Aksi takdirde uzun değer V

olan

değeri bir int olarak temsil edilebilir, daha sonra birinci aşamanın sonucu

Aksi halde, aşağıdaki iki durum arasında bir doğru olmalıdır sayı değeri V. :

değeri çok küçük olması gerekir (a büyük büyüklükte negatif değer veya negatif sonsuzluk) ve ilk adımın sonucu int veya long türünün en küçük gösterilebilir değeridir.

değeri çok büyük olması gerekir ve ilk aşamanın sonucu (büyük bir büyüklük ya da pozitif sonsuz bir pozitif değer) int türü ya da uzun büyük Temsil değerdir. İkinci adımda

:

Tıç veya uzunsa, dönüştürme sonucu birinci aşamada bir sonucudur.

T bayt, kömür ya da kısa ise, dönüştürme sonucu daralan bir dönüşüm sonuç T tipi için (§5.1.3) ilk aşaması sonucu.

Böylece sonsuz çift değeri int ilk döküm, Integer.MAX_VALUE döndürerek ve sonra düşük bayt uygun sayıda alır (ve getirir -1 sonucu byte/short daha fazla döküm olduğu). Atmalarını için int ve long o ekstra adımı yok, ama byte ve shortbyte/short sonraint ve aracılığıyla ilk gidin.

+0

Ayrıca Narrowing Primitive Conversion'a başvurmak üzereydim! +1 –

İlgili konular