近來一直在學習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的最大值呢
代碼如下:
具體的思想我也用圓圈理論表示出來