首先說點題外話,這是我第一次寫博客,我是一個小白,我寫博客的目的是為了通過它能夠讓我對知識和問題理解的更深刻一點,時常總結是一種好的學習習慣和方法,同時把我對一些問題的理解寫出來,也幻想有的大牛能看到,指出我的問題所在!!!
C語言中,數據類型有short,int,long,char,float,double,然後除了浮點型只有 有符號數(signed)外,其他的數據類型都分為有符號(signed)和無符號(unsigned)。這些數據類型都有一個取值范圍,下面我就通過char類型來表達我對數據類型取值范圍的計算的理解。
大家都知道 char 類型是1個字節=8個二進制位,其取值范圍是:-2^7~2^7-1;那麼這個取值范圍是怎麼計算得來的呢,首先我們說說,在計算機中,一個變量的最高位表示符號位,規定0代表整數,1代表負數;剩下的其他為的值為這個變量的值。所以,在char類型中,最大的正整數為:0111 1111(2^7-1:可以將0111 1111看成是1000 0000-1所得)。最小的負整數為:1111 1111 (-(2^7-1))。咦!前面不是說最小的是-2^7麼?
當我們以二進制原碼表示時:取值范圍:1111 1111(-(2^7-1))~1000 0000(-0)和0000 0000(+0)~0111 1111(2^7-1),所以從這裡我們可以看出,編碼情況要比真實的數值情況多出一種:1000 0000和0000 0000都表示0這個數
但是在計算機中,存儲數據采用的是補碼的方式進行存儲的,也就是正數的編碼不變,即正數范圍依舊是0000 0000(+0)~0111 1111(2^7-1),而負數需要符號位不變,其他位取反,取反後再加1,所以我們就直接來看1000 0000(-0),其補碼為0000 0000,好了,到了這裡,我們可以看出,計算機以補碼的方式存儲變量時,不管是+0還是-0,其編碼都變成了0000 0000,所以 那麼就多出來了一個編碼1000 0000,,但是因為任何一個原碼都不可能在轉變成補碼時是1000 0000,因此就人為的規定1000 0000 為-2^7。
所以,最後我們得到char的取值范圍就是 -2^7~2^7-1;