2013-06-20 37 views
7

自從我開始使用eclipse進行euler項目時,我注意到有時候大數字會變成一個看似隨機的負數。我想這與通過類型的低音有關。通常大數變成負數

如果你能向我解釋這些負數是如何產生的以及它背後的邏輯是什麼,我會很高興。另外,我如何避免它們(最好不要使用BigInteger類)。 Danke!=)

+0

我猜「使用eclipse」的意思是「使用java」。我希望你知道eclipse與你的問題無關 – Elazar

+0

Eclipse只是一個IDE。這意味着它只是您編輯,編譯和運行代碼的地方。你可能用Java編碼。 –

+1

迴避取決於您的具體問題。有時你無法避免使用'Biginteger',有時你可以。 – Elazar

回答

10

此圖顯示了您要查找的內容。在你的情況下,它顯然是更大的數字,但原則保持不變。

java中的限制示例如下:
int:-2,147,483,648至2,147,483,647。
長:-9,223,372,036,854,775,808 9,223,372,036,854,775,807


在圖像0000,0001等,示出了數字的二進制表示。

Image explaining two's complement

編輯:在項目歐拉你經常不得不想辦法來解決lagre號碼。這些問題的設計數字很大,因此您無法使用普通的解決問題的方式。但是,如果您發現您確實需要使用它們,我建議您無論如何都要學習BigInteger。從長遠來看,你會發現它很有用,並不是那麼複雜。這裏有一個有很多可以理解的例子的鏈接: BigInteger Example

1

在數學中數字是無限的。但是在計算機中他們不是。每個int類型:int,short,longMAX_VALUE。例如Integer.MAX_VALUE。當您嘗試增加超過此值的數字時,該數字變爲負數。這樣數字的內部二進制表示就可以工作。

int i = Integer.MAX_VALUE; 
i++; // i becomes negative. 
+1

更具體地說,它變成了'Integer.MIN_VALUE'。 –

+0

讓我驗證一下 - max_value之後的下一個數字是-1? (我的意思是(int)2^31 + 1 = -1? – user2435678

+0

不是,Integer.MAX_VALUE後面的下一個值是Integer.MIN_VALUE,就像@Boris the Spider – AlexR

1

您可能會溢出您的數據類型的大小,因爲最重要的位是符號位。我不認爲Java有unsigned數據類型,所以如果你想保存比int更大的數字,你可以嘗試使用更大的數據類型,如long。如果你仍然溢出long雖然,你幾乎堅持BigInteger

1

下面是2位整數two's complement表示:(U表示無符號,S是指簽名)

U | bits | S 
--------------- 
0 | 00 | 0 
1 | 01 | 1 \ overflow here: 
2 | 10 | -2/ 1 + 1 = -2 
3 | 11 | -1 

算術做大多喜歡在無符號的情況下,模最大(U)(4在我們的例子)。

對於更大的類型,邏輯是相同的。 Java中的int是32位。對於64位使用long