回答
這是因爲在大多數編程語言中,整數數據類型具有固定的大小。
這意味着每個整數值都有一個定義的MIN和MAX值。
例如,在C#MAX INT是2147483647和MIN是-2147483648 在PHP中32位是2147483647和-2147483648 在PHP中64位是9223372036854775807和-9223372036854775808
,當你嘗試去在那發生什麼事值?簡單地說,計算機將產生所謂的整數溢出,並且該值將循環回最小值。
換句話說,在C#2147483647 + 1 = -2147483648(假設使用的整數數據類型,不長或浮動)。這正是50000 * 50000發生的情況,它會超過最大值並從下一個值開始循環。
確切最小值和最大值依賴於所使用的語言,代碼是建立在平臺,該平臺的代碼運行上和靜態類型的值的。
希望它爲你清除一切!
32位帶符號的整數,通過使用位0-30作爲數字存儲和31位表示的數目的符號。
這意味着,可以表示的最大值爲2147483647(0-30的所有位被置位,位31爲0,表示一個正數)。
50,000和50,000個產品是250億是大於這個數,你有所謂的溢出。這意味着數據已經從其預期邊界(底部31位)「溢出」到符號位中)。
您現在有第31位,表明這是一個負數。要從它的二進制表示中找出一個負數,你需要用補碼(翻轉所有位),加一個,然後在它前面加一個負號。
要小心,當你走的補,你將自己限制在32位範圍......你不應該包括除高一點31
瞭解更多信息退房signed number representations位。
示例程序僞碼
Print --> ("Size of int: " + (Integer.SIZE/8) + " bytes.");
int a=50000;
int b=50000;
Print --> (" Product of a and b " + a*b);
Output :
Size of int: 4 bytes.
Product of a and b:-1794967296
分析: 4個字節= 4 * 8 = 32位。
由於符號int可容納負值,一比特被用於符號( - 或+),因此可用於數字範圍= 31比特。 數範圍= - (2^31),0(2^31-1) [一個正數被犧牲0]
-2147483648,0到2147483647
最大可能的正INT = 2147483647 (大於1600000000,因此40000 * 40000很好) 實際產品50000 * 50000 = 2500000000(大於2147483647)
實際上,許多便攜式C程序假設使用二進制補碼算法可靠地迴繞有符號整數溢出。然而,C標準認爲程序行爲在溢出時是未定義的,在一些情況下,C程序不適用於某些現代實現,因爲它們的溢出不會像作者期望的那樣環繞。 http://www.gnu.org/software/autoconf/manual/autoconf-2.62/html_node/Integer-Overflow.html
- 1. 爲什麼有一個比正整數更多的負整數?
- 2. 在一個Java方法中查找負整數和正整數的乘積。答案正在打印0
- 3. 正整數爲負數
- 4. 什麼是正整數分解爲整數的正確方法?
- 5. Double.MaxValue爲整數是負數?
- 6. OWL:非負整數與正整數有什麼區別?
- 7. 乘兩個大整數存儲爲整數載體
- 8. 比較兩個整數:爲什麼==真?
- 9. 爲什麼兩個size_t的乘積是錯的?
- 10. 散列正整數/負整數序列
- 11. 正整數/負整數VB.NET textbox maxlength
- 12. 什麼是漸進整數的乘積的複雜性在Java中
- 13. 正則表達式在Python中爲正整數和負整數
- 14. (ASM)如何使正整數爲負數?
- 15. 爲什麼在這個乘法中有一個整數溢出?
- 16. 檢查整數是否是其主要因子的乘積
- 17. 爲什麼兩個正整數在劃分時等於零?
- 18. 正整數乘法用C
- 19. 乘以兩個長整數C
- 20. 批量中乘以兩個整數
- 21. 當兩個整數相乘時NumberFormatException
- 22. 爲什麼要將兩個32位整數合併成一個64位整數?
- 23. 正乘n的整數數組
- 24. 如何將帶負整數的NSString轉換爲負整數
- 25. 乘以整數
- 26. 將正整數轉換爲負值
- 27. 爲什麼Math.pow(a,b)是NaN當a是負數並且b是非整數?
- 28. 爲什麼我的整數總是零?
- 29. 整數除法的行爲是什麼?
- 30. 爲什麼這個C++代碼不適用於負整數?
在這個例子中我們得到0.原因是3.14是如此小的數量,如果我們與-1e20相比,我是對嗎? –
你應該在一個新的問題中提出這個問題,但要回答簡單的話,float總是存儲數字中最重要的部分(這就是爲什麼它們是浮動的)。所以1e20 - 1e20 = 0和0 + 3.14 = 3.14。另一方面,-1e20 + 3.14 = 1e20(原因3.14不夠重要),因此最終結果爲0.0 – Atrakeur