有鑑於這個概念不是很好懂,所以特別寫這篇~~

我們電腦一般而言,能夠處理的數字大小是有限的!

如果你輸入一個數字,讓電腦處理「破表」,那麼輸出的答案就不會正確

例如電腦只能接受20億以內的數值,你輸入兩個15億相加,就不會輸出正確的結果

至於電腦能夠處理的數值大小,和你提供給他的記憶體大小有關

也就是說,給予越多的記憶體,電腦能夠處理的數值大小就越大

所以,我們在程式中「宣告」一個變數

就是告訴電腦,我們這個變數,需要多大的記憶體來處理

而,宣告不同的「資料型態」,就代表著提供給這個數值不同的記憶體大小

至於資料型態,有以下幾種:



所以,如果你在程式裡面輸入「 int a; 」

就是代表,你宣告一個名字叫做 「a」 的變數在記憶體裡,
這個變數的資料型態是「int」 (integer)
這個變數在記憶體中占了 4 bytes



至於這個 4 bytes 的變數,到底可以承受多大的數值呢?

我們需要一些基本知識


【圖 1 】 《 1 bit  》

既然 1 bit 只能裝 「0」「1」,那麼一共能裝幾種數字呢? 當然是兩種啦!

那麼 2 bit 可以裝「00」「01」「10」「11」,一共可以裝幾種數字呢?四種

接著 3 bit 可能裝「000」「001」「010」「011」「100」「101」「110」「111」,共八種

所以,我們可以歸納出,如果有 n 個 bit ,那麼他就可以裝 2 ^ n 種數字

( ex. 6 bits 可以裝 2 ^ 6 = 64 種數字 )




接著,1 byte 就是 8 bits


然後,4 bytes 就是 32 bits


那麼剛才的 4 byte 的記憶體大小,究竟能夠承受多大的數值呢?

所謂 4 bytes = 32 bits

所以一共能裝 2 ^ 32 種數字

但是注意,我們這邊只是說他能裝 2 ^ 32「種」數字,並不代表這個變數能夠承受的最大數值就是 2 ^ 32

要看你宣告的資料型態是什麼!

宣告 int (含負數的整數)

2 ^ 32 = 4294967296

不過由於我們將這個數字的「配額」一半分給負數了

所以能夠裝的數值是 ( -2147483648 ~ -1 ,  0 ~ 2147483647 )

因此,「int a;」的「a」能夠接受的最大正數是
2147483647,最大負數是-2147483648

(至於為什麼負數能承受的數值居然設計成比正數多呢?這是因為電腦正負數採用Two's complement表示法的緣故,有興趣的可以查詢相關資料)

另外,如果你確定宣告的變數不會動到負數,那麼你可以宣告一個沒有負數的變數,把負數的「配額」全部還給正數

宣告 unsigned int  (不含負數的整數)

能夠裝的數值是( 0 ~ 4294967295 )

因此,「unsigned int a;」的「a」能夠接受的數值範圍是 0 ~ 4294967295

如果這邊能夠了解,相信你將來在寫程式對於「宣告變數和記憶體的關係」就能有所掌握了!

arrow
arrow
    全站熱搜

    finalfrank 發表在 痞客邦 留言(1) 人氣()