整形包括字符、短整形、整形、長(zhǎng)整形,整形的存儲(chǔ)方式都是一樣的,整形在存儲(chǔ)時(shí)都是以補(bǔ)碼進(jìn)行存儲(chǔ)的。
下面用char來解釋:
signed char -128 到127
unsigned char 0 到 255
short int -32768 到32797
unsigned short int 0 到65535
Char
Char類型其實(shí)也是一種整形,因?yàn)閏har的每個(gè)字符都是由0到255的整形數(shù)字來表示的;
ANSI C提供了char、signed char和unsigned char三種字符類型;
它們都是按照一個(gè)字節(jié)存儲(chǔ)的,可以保存256個(gè)不同的值;
unsigned char無符號(hào)的整形存儲(chǔ)簡(jiǎn)單,因?yàn)檎麛?shù)的原反補(bǔ)碼相等,范圍是0到255,直接存入相應(yīng)的二進(jìn)制。
signed char 的取值范圍在-128到+127,為什么在這個(gè)范圍呢?
計(jì)算機(jī)在存儲(chǔ)數(shù)據(jù)都是以數(shù)據(jù)的補(bǔ)碼來進(jìn)行存儲(chǔ),有符號(hào)類型存儲(chǔ)是,最高被當(dāng)做符號(hào)位,0正1負(fù),所以signed char取值范圍在
-(2^7)-1到+(2^7)-1,但是發(fā)現(xiàn)這個(gè)值是-127到+127,這是因?yàn)?#43;0和-0被計(jì)算了兩次,但實(shí)際情況0只有一個(gè),計(jì)算機(jī)一般把+0當(dāng)做零,把-0當(dāng)做-128,所以signed char 的取值范圍是-128到+127;
這里計(jì)算機(jī)是怎樣把-0識(shí)別為-128?
因?yàn)橄到y(tǒng)識(shí)別到最高位是1后面全0的情況,系統(tǒng)會(huì)在最高位自動(dòng)添加一個(gè)符號(hào)位,所以-128具有9個(gè)bit位
-128在存入內(nèi)存的時(shí),因?yàn)閏har只有8個(gè)bit位,所以讀取低8位,結(jié)果是1000 0000;
與-0的二進(jìn)制序列一樣,所以就用-128表示-0;系統(tǒng)識(shí)別1000 0000 時(shí)就會(huì)自動(dòng)添加一個(gè)符號(hào)位,就是-128了。(在這里計(jì)算時(shí)符號(hào)位參與運(yùn)算)
原碼 1 1000 0000
反碼 1 0111 1111
補(bǔ)碼 1 1000 0000
下面看幾個(gè)有關(guān)理解整形存儲(chǔ)的代碼:
#include<stdio.h>#include<windows.h>int main(){ unsigned char a = -1; signed char b= -1; char c = -1; PRintf("a=%d b=%d c=%d/n", a, b,c); system("pause"); return 0;}signed char型提升為int型打印時(shí),char補(bǔ)碼的符號(hào)位前面要全補(bǔ)成和char相同的符號(hào)位,然后在把最高位當(dāng)做符號(hào)位,求原碼。
#include<stdio.h>#include<windows.h>int main(){ char a = 128; char b = -128; printf("a = %u/nb = %u/n", a,b); system("pause"); return 0;}不論是128 還是-128保存到cahr a里面都是讀取補(bǔ)碼的低8位即1000 0000;
在a解釋用于打印的時(shí)候會(huì)把最高位(第八位)作為符號(hào)位即1,所以char 提升為unsigned int類型,char的符號(hào)位前面的根據(jù)char類型全補(bǔ)成1。 然后以無符號(hào)整形輸出。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注