2017-09-28 71 views

回答

0

這是因爲在大多數編程語言中,整數數據類型具有固定的大小。

這意味着每個整數值都有一個定義的MIN和MAX值。

例如,在C#MAX INT是2147483647和MIN是-2147483648 在PHP中32位是2147483647和-2147483648 在PHP中64位是9223372036854775807和-9223372036854775808

,當你嘗試去在那發生什麼事值?簡單地說,計算機將產生所謂的整數溢出,並且該值將循環回最小值。

換句話說,在C#2147483647 + 1 = -2147483648(假設使用的整數數據類型,不長或浮動)。這正是50000 * 50000發生的情況,它會超過最大值並從下一個值開始循環。

確切最小值和最大值依賴於所使用的語言,代碼是建立在平臺,該平臺的代碼運行上和靜態類型的值的。

希望它爲你清除一切!

+0

在這個例子中我們得到0.原因是3.14是如此小的數量,如果我們與-1e20相比,我是對嗎? –

+0

你應該在一個新的問題中提出這個問題,但要回答簡單的話,float總是存儲數字中最重要的部分(這就是爲什麼它們是浮動的)。所以1e20 - 1e20 = 0和0 + 3.14 = 3.14。另一方面,-1e20 + 3.14 = 1e20(原因3.14不夠重要),因此最終結果爲0.0 – Atrakeur

1

32位帶符號的整數,通過使用位0-30作爲數字存儲和31位表示的數目的符號。

這意味着,可以表示的最大值爲2147483647(0-30的所有位被置位,位31爲0,表示一個正數)。

50,000和50,000個產品是250億是大於這個數,你有所謂的溢出。這意味着數據已經從其預期邊界(底部31位)「溢出」到符號位中)。

您現在有第31位,表明這是一個負數。要從它的二進制表示中找出一個負數,你需要用補碼(翻轉所有位),加一個,然後在它前面加一個負號。

要小心,當你走的補,你將自己限制在32位範圍......你不應該包括除高一點31

瞭解更多信息退房signed number representations位。

1

示例程序僞碼

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