回首c語言:了解char的取值范圍及數據越界問題


近來一直在學習python之類的高級語言,前幾天被一個學弟問了C語言中關於char的一系列問題

結果一時回答不上來,畢竟很久沒有復習最基礎但是也是最講究是C語言了,遂抽出不分時間開始溫習C語言數據類型,經過研究得出下列結論。

首先放出問題:

1.char的取值范圍是多少,為什么是這樣。

2.如何用程序數出int類型的最大數字。

在看接下來的答總結的時候,也先請大家仔細思考一下,題目看似簡單,實則需要結合原碼,反碼和補碼問題才能解決。

首先明確一點:

無論是char short int float還是double,他們存儲數字的方式都是將原數以補碼的形式放入到內存中的,他們的補碼最左邊的一位都是用來表示正負的:1表示負數,0表示正數。

 

char在C語言中是占用1個字節的,一個字節是8bit,也就是8位,

當我們用char表示”1“這個數字的時候,其補碼形式就是 0000 0001。

 

先看char可以表示的最大正整數

char能表示的最大的正整字就是0111 1111,這個二進制數轉化為十進制就是:

這里由等比數列前N相和公式可以算出來正整數最大表示的是2^7-1=127

所以,正整數最高為127,則負整數最小就是-127嗎?由此樂意確定char的表達范圍是-127——0——127了嗎?

 

答案是不,接下來看:

 

我們這里看一個比較特殊的數字:-0

它可以用原碼1000 0000來表示,

咱們把1000 0000轉為補碼看看,

1000 0000取反為1111 1111,

再加1可得1 0000 0000;

由於溢出(超過了char的8位數)所以-0的補碼就是0000 0000

 

我們再來看看-128,

-128的原碼可以寫成1 1000 0000,

我們來對其運算補碼,

取反1 0111 1111再+1可以得到1 1000 0000

由於溢出了(超過了char的8位數),我們去掉第九位那么-128的補碼就是1000 0000

 

-128的補碼和-0的原碼是相等的

所以這里我們就可以直接把-128看作-0。

 

這里可以明確的是:

-0的原碼和-128的補碼在char的情況下是相等的

所以我們說

Char的范圍是-128——127

實際上char的范圍是-127——-0和0——127之間,但是-128的補碼和-0的原碼在char的情況下由於溢出就可以看成-0=-128

 

 

圓圈理論的引入

我們可以將char的取值范圍可以看成是一個圓形,如下圖:

 

 

當127+1的時候,就等於-128了,我們看代碼:

 

這里你可能會有一個疑問:如果這樣寫呢?

原因很簡單,因為這個地方%d是整形,最大可以表示的數字是2的31次方-1;

當a+2放到這里以后就會被自動看成unsigned形式,其運算將結果遠遠小於%d可以表達的最大數字,所以可以照常輸出。

 

 

那么我們利用圓圈理論,怎樣數出int的最大值呢

代碼如下:

 

 

 具體的思想我也用圓圈理論表示出來

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM