2011-02-25 55 views
1

我試圖將java中的函數轉換爲pl/pgsql,而我發現的一個問題是當我試圖總結2個負數時,並且得到一個正數,更具體:Java總和2負數

public void sum(){ 
    int n1 = -1808642602; 
    int n2 = -904321301; 
    System.out.println(n1 + n2);// result is 1582003393 
} 

而用PL/pgSQL我走出範圍誤差的整數,並且如果更改變量類型爲bigint我得到的2個負數的正常和,即-2712963903,代替1582003393

我該怎麼做pl/pgsql得到相同的結果而不打印整數超出範圍錯誤?

+1

我愛這裏的問題你只要知道答案即將涌入。 – Shaded 2011-02-25 19:30:07

+0

具體來說,相同的答案,在30秒內輸入彼此。 :) – 2011-02-25 19:42:33

+0

使用'長',知道你的類型的界限。 – bestsss 2011-02-25 21:24:41

回答

4

發生這種情況是因爲Java int下溢並不會告訴您。

要得到你正在尋找的答案,你需要使用bigint。然後在結果小於Java Integer.MIN_INT(-2^31)時檢測該情況,Java會給出肯定結果。爲了得到Java給你的東西,添加2^32。

+0

公平地說,被回答的問題是「Java如何總結數字」。這個問題在回答之後改變/演變/澄清。沒關係。 – 2011-02-25 19:52:49

+0

謝謝,那就是我一直在尋找的 – 2011-02-25 19:54:51

2

你正在溢出int嘗試與long同樣的事情,它應該工作。

1

Java將它們總結爲32位有符號整數,它們包含在-2 。你有沒有試過64位長?

2

它溢出了,因爲int的結果太大了。改爲使用長。

1

Java中的int的有效rand是-2,147,483,648 to 2,147,483,647-2^31 - 2^31-1)。

您正在導致整數下溢。您應該使用類型long而不是int,其範圍從-2^63 to 2^63-1

-1

嘗試使用long將在此情況下(足夠大的數字,但意志)不會溢出

System.out.println((long) n1 + n2); 
0

的Java把那些2號作爲符號整數。 基本上,燒結整數的範圍是-2,147,483,648到2,147,483,647(-2^31 - 2^31-1)。 因此那些值的總和是-2712963903這低於最低-2^31和,下溢,然後通過執行2^32環繞 - 2712963903,讓你的符號int 1582003393.