電腦與數學之資料範圍

來源:互聯網
上載者:User

標籤:

廢話不說,先來一段程式,諸位童鞋們猜猜這段程式的輸出:

#include<stdio.h>
#define MAX 255

int main(int argc, char **argv) {
unsigned char i, a[MAX];
for(i = 0; i <= MAX; i++) {
a[i] = i;
}
for(i = 0; i <= MAX; i++) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}

童鞋們可以在你們的電腦上跑一下上面代碼,有驚喜奧

還在等待輸出嗎?不用等了,永遠不會有輸出了,因為這是個死迴圈。話說哪來的死迴圈呢?這便要談一談電腦整型資料的表示範圍和資料溢出啦

看到這裡,我們要思考:對於unsigned char i = 255;i + 1 = ?

電腦中的加減乘除並不像我們平常數學中那樣,因為在數學中你已經假設了資料範圍為無窮大。但在電腦中,資源是有限的,為了充分利用資源,我們規定了佔有不同位的資料類型。如unsigned char,它和char一樣是8位,區別是首位不用做符號位,於是有:0000 0000 - 1111 1111 ,二進位轉化為十進位就是0 - 255.現在再討論上述程式:

    1111 1111

+                 1

--------------------

 1 0000 0000

上面我們說了,對於各種資料類型,用於表示表示的位元是固定的,那麼結果中的首位的1便會由於沒地方儲存而捨棄,於是你驚奇的發現 255 + 1 = 0

其實再思考上面的計算過程溢出位,我們發現按權值計算溢出位的表示大小相當於:溢出位*2^8.例如上面捨棄的1表示的實際大小為 1*2^8 = 256,

分析上面捨棄的行為,你會發現數學上有相對應的操作,它就是模數

好了,經過上面的分析,你應該會發現什麼,總結一下不帶正負號的整數的計算,再類推到有符號整數

對於溢出問題,提出如下問題以供思考:

1.有符號數和無符號數之間的轉化(不同資料類型之間轉化)

2.無符號加法,無符號乘法

3.有符號加法,有符號乘法

電腦與數學之資料範圍

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.