2013-01-31 187 views
3

我有一個關於從int到長轉換在java中的問題。 爲什麼對花車就沒有問題:鑄造一個int到長

float f = (float)45.45;//compiles no issue. 
float f = 45.45f; //compiles no issue. 

但是從長遠類型似乎是一個問題:

long l = (long)12213213213; 
    //with L or l at the end it will work though. 
    long l = (long)12213213213L; 

看來,一旦編譯器通知錯誤由於亂在沒有檢查程序員可能已經計劃的任何可能的轉換的情況下,它在那裏阻塞。

你對此有何看法?爲什麼它有什麼特別的原因?

在此先感謝。

回答

4

Java並沒有考慮你對一個值做了什麼,而只是它是什麼。例如,如果您有一個太長的值,那麼將其分配給double值無關緊要,則首先將long值檢查爲有效。

8

但是從長遠類型似乎是一個問題:

這是因爲12213213213沒有Lint,而不是long。並且由於該值超出了int的範圍,所以您會收到錯誤消息。

試着這麼做: -

System.out.println(Integer.MAX_VALUE); 
System.out.println(12213213213L); 

你會更好地理解。

至於的float情況而言: -

float f = (float)45.45; 

45.45double值,適合的double大小。因此,編譯器將沒有問題,然後它將執行castfloat

看來,一旦編譯器通知錯誤由於超出範圍 問題,它會阻止那裏,不檢查任何可能的流延 程序員可能已經計劃。

沒錯。編譯器首先檢查一個有效值,在這裏int,只有它隨着轉換操作才能進一步移動。

所以,基本上在以下情況下longint: -

long l = (long)12213213213; 

你沒有得到,因爲cast操作的錯誤,而是因爲你的numeric literal是不能表示爲int。所以,編譯器在那裏沒有得到有效的值來執行一個強制操作。

+0

我明白了,但是我的問題旨在瞭解爲什麼鑄造(長)12213213213;在這種情況下沒有考慮到,而在浮動時f =(浮動)45.45; (請注意,如果沒有投射它會發生錯誤)正常工作。 – Rollerball

+1

@滾球..錯誤不是因爲鑄造。編譯器沒有機會到達那裏。只有在注意到「12213213213」時纔會停止,並且說,嘿,等待,這個數字不能表示爲「int」。所以,它給了你一個錯誤。這暗示了一個事實,最後沒有'L'的數字是'int'。所以,'4'是一個'int',但'4L'是一個'long'。 –

+0

@每個人都閱讀此評論。我徹底明白錯誤的重點。然而,有沒有人知道爲什麼編譯器停止在那裏沒有檢查鑄造?考慮到如果演員已經被編譯器看到了,那麼它就會工作。 – Rollerball