2013-12-10 53 views
0

下面的代碼將設置X作爲「無限」存儲值無限遠到變量

#include <limits.h> 
int x = INT_MAX; 

當我說int x = 3;,編譯變量x分配一些內存資源。當我說int x = INT_MAX;編譯器端發生了什麼?

+2

'下面的代碼將x設置爲「無窮大」誰說的? – this

+0

@self http://stackoverflow.com/questions/2273913/how-would-you-set-a-variable-to-the-largest-number-possible-in-c – Ank

+1

完全一樣; 'INT_MAX'只是一個相當大的數字,但肯定不是無窮大。 –

回答

4

對於int s,可能沒有無窮大值,因爲int s具有固定的二進制大小。假設你有9位數字來寫你喜歡的任何數字。 9位數字相當大:可以達到999,999,999;但是你沒有辦法用這個來代表「無限」。今天的通用平臺

整數是由32位,所以INT_MAX擴展爲二進制值0111 1111 1111 1111 1111 1111 1111 1111,其值爲2 -1(略高於2個億)。 (最後一位是符號位,不能用於使數字更大)。

要回答你的實際問題,無論你放入一個整數值,編譯器總是爲它分配相同的大小。

浮點數字,另一方面,是陌生的野獸,並有一個特定的二進制模式來表示無窮大(或負無窮大)值。這是可能的,因爲IEEE-794數字在內存中表示:有一個符號位,一些指數位,然後是尾數。任何浮點數,無論是float還是double,都可以表示爲±(位模式)x 2 ^(指數)。但是,對於「非數字」(對於非數字也稱爲NaN),也有特殊位模式,如0.0/0.0的結果,以及無限值的特殊位模式,如任何數字的結果0除以0.(這在數學上不是確切的,但是它的工作方式。)如果我沒有記錯,無限可以通過指數部分達到其最大值來表示,但我可能會被誤解。

請注意,這並不意味着您可以將任何號碼存儲在浮點數中。根據比特數,「僅」2^64個可能的不同值可以在double中表示,這是一個瘋狂的大數目,但仍然不是無限的。當你得到更大的數字(或者更精確的數字)時,你會看到你可以表示的值的「漏洞」。例如,在可以放入雙倍數的最大有限數與無窮大常數之間有一個很好的無限步驟。

具有無窮大值的一點是提供一個常數,它必然比其他任何值更大(或者在負無窮大的情況下更小)。從這個意義上說,儘管聽起來比INT_MAX更令人印象深刻,但它幾乎完成了同樣的事情。

就像INT_MAX,它有一個常數,不出意外的是INFINITY

+0

感謝您的詳細解答 – Ank

+0

'另一方面,浮點數是陌生的動物,並且有一個特定的二進制模式來表示無窮大(或負無窮大)值。「您能詳細解釋一下這個問題嗎? – Ank

+0

是啊,我會用更多的信息編輯我的答案。 – zneak

7

這不會將該值設置爲無窮大。用整數,沒有任何價值可以代表無限。相反,它會將其設置爲int可表示的最大值。如果int恰好是32位整數,那麼INT_MAX == 2147483647

1

它不是將int設置爲無窮大,而是將其設置爲整數的最大值。對於32位操作系統,爲2,147,483,647。它基本上存儲31個1和一個符號位。