2014-02-10 75 views
0

簡單的代碼沒有問題簡單的Java整數和長算術

long x = Integer.MAX_VALUE; 
System.out.println(x * 2 + "...." + Long.MAX_VALUE); 

= 4294967294....9223372036854775807 

但這裏發生了什麼?爲什麼-2

System.out.println(2 * Integer.MAX_VALUE + "...." + Long.MAX_VALUE); 
= -2....9223372036854775807 

爲什麼元素是149998,編譯器不會將這些元素轉換爲long嗎?

long elements = 2 * Integer.MAX_VALUE + 150000; 
System.out.println(elements + "...." + Long.MAX_VALUE); 
149998....9223372036854775807 

-Thanks

+0

它會在哪裏知道要轉換?在第三個表達式中,你根本不使用「long」......而在第二個表達式中,你不會使用它,直到它爲時已晚。 – cHao

+0

你爲什麼認爲這是發生?爲什麼不應該這樣做? –

回答

3
and why elements is 149998, doesn't the compiler converts these to long? 

呢,但只有之後的這個算術。所以你有int * int + int,它是一個int。然後它會投下它很長的時間。然而,在這一點上,你已經有了一個整數溢出(即它超出了一個整數的範圍)

你需要的正確的數字轉換成一個長的第一

long elements = 2L * Integer.MAX_VALUE + 150000; 

long elements = 2 * (long)Integer.MAX_VALUE + 150000; 

6

促進從整數變量長。

long elements = 2 * Integer.MAX_VALUE + 150000; 

應該

long elements = 2L * Integer.MAX_VALUE + 150000; 

原始語句的評價,

long elements = 2 * Integer.MAX_VALUE + 150000; 

相當於

long elements = (long)(2 * Integer.MAX_VALUE + 150000); 
1
Integer.MAX_VALUE =2147483647=01111111 11111111 11111111 11111111 

而且

2*Integer.MAX_VALUE=4294967294=2*(01111111 11111111 11111111 11111111) 
           =this will result a 33-bit value 

但是在Java中int可以表示最大32bit。

+0

也是它的燒傷,ergo的負值 – diazazar

0

我沒有足夠的代表尚未就此發表評論:(。

Oracle的Java教程確認將數據轉換爲基本類型long。既然你要添加一個int和一個長, 。它把它轉換成一個很久以前的編譯器將添加數據如果你真的希望它是一個漫長的整段時間,你必須強制類型轉換

EX。

// (long) is typcasted 
long elements = 2 * (long) Integer.MAX_VALUE + 150000; 

//prints elements as a long t + "" + max value 
System.out.println(elements + "...." + Long.MAX_VALUE); 

類型是鑄造通過在當前數據類型前添加所需的基元類型來執行此操作。