字符型(char)用于儲(chǔ)存字符(character),如英文字母或標(biāo)點(diǎn)。但是char
類型在內(nèi)存中并不是以字符的形式儲(chǔ)存,而是以ASII碼的形式儲(chǔ)存,也可以說char
類型儲(chǔ)存的實(shí)際上是整數(shù)。所以char
類型也被歸類為整形家族。
int main()
{char c = 'A';
printf("%d\n", c);
printf("%c\n", c);
return 0;
}
從上面的代碼可以看出,因?yàn)閏har類型儲(chǔ)存的是整形,所以可以以正數(shù)的形式打印出
打開內(nèi)存窗口,也可以看出char
是以整數(shù)的形式存儲(chǔ):
既然知道char
實(shí)際上是整形,所以也可以用int
類型對(duì)char
類型賦值
int main()
{char c = 65;
printf("%d\n", c);
printf("%c\n", c);
return 0;
}
以
%d
輸出就是輸出存儲(chǔ)在內(nèi)存中的整形,以%c
輸出就會(huì)輸出初始化時(shí)整數(shù)對(duì)應(yīng)的ASKII碼字符
其實(shí)關(guān)于由int
類型對(duì)char
賦值,以及對(duì)于char
類型之間的運(yùn)算,其實(shí)都會(huì)經(jīng)歷一個(gè)操作叫做:整形提升
,整形提升的詳細(xì)介紹在另一篇文章里👉點(diǎn)擊跳轉(zhuǎn)
當(dāng)聽到char的類型這句話時(shí),第一反應(yīng)應(yīng)該會(huì)是:“char的類型不就是char嘛”
其實(shí)不然,char
類型實(shí)際上分區(qū)為有符號(hào)的signed char
和無符號(hào)的unsigned char
你可能對(duì)有無符號(hào)可能會(huì)陌生,對(duì)于有無符號(hào)我在另一篇文章里詳細(xì)介紹了👉點(diǎn)擊跳轉(zhuǎn)
對(duì)于char
的有無符號(hào)位比較特殊的是:
char
與signed char
不一定等價(jià)char
默認(rèn)是signed char
還是unsigned char
取決于編譯器char
類型都默認(rèn)為signed char
char
類型占1個(gè)字節(jié),也就是8個(gè)比特位
所以char
在內(nèi)存中以00000000
開始,逐漸遞增,到011111111
,在增加到100000000
,最后到11111111
,如下圖:
對(duì)于signed char
來說:
00000000
為0,逐漸遞增到011111111
為127,因?yàn)榈谝晃皇欠?hào)位,所以再+1后的100000000
為負(fù)數(shù)。
從最下面的開始算,11111111
為-1,向上逐漸遞減,到100000001
時(shí),為-127,所以100000000
為-128。
所以,有符號(hào)的char
的取值范圍是:-128 ~ 127
對(duì)于unsigned char
來說:
當(dāng)二進(jìn)制最高好比特位的數(shù)為0時(shí),無符號(hào)的char與有符號(hào)的char相同,當(dāng)制最高好比特位的數(shù)為1時(shí),因?yàn)槭菬o符號(hào)的char,所以
100000000
為128,直到11111111
為255
所以,無符號(hào)的char
的取值范圍是:0 ~ 255
下面這幅圖可以形象地表示出char類型數(shù)據(jù)范圍
其實(shí),這個(gè)圖還可以體現(xiàn)出
char
類型的“循環(huán)”
在給char
類型賦值為超過它的取值范圍的值時(shí),在char
中的會(huì)按照?qǐng)D中的循環(huán)方向進(jìn)行存儲(chǔ)值,這其實(shí)是由于整形提升導(dǎo)致的,但是通過照著這個(gè)圖會(huì)比分析整形提升的過程更方便得出實(shí)際char
中的值
int main()
{char c = 129;
printf("%d", c);
return 0;
}
這個(gè)程序輸出是-127,而不是129
此代碼中,char
類型默認(rèn)是有符號(hào)的char
,它的取值范圍是-128 ~ 127,但是給c
賦值為129,超出了取值范圍
所以照著圖就可以看出:129超了127兩位,在圖里127向后走兩位就是-127
無符號(hào)整形也是如此。
例1
//輸出什么?
#includeint main()
{char a= -1;
signed char b=-1;
unsigned char c=-1;
printf("a=%d,b=%d,c=%d",a,b,c);
return 0;
}
在這里char
和signed char
是一個(gè)意思,有符號(hào)的char
取值范圍是-128 ~ 127,-1在這個(gè)范圍中,所以a,b 都輸出 -1
無符號(hào)的范圍是0 ~ 255,-1不在這個(gè)范圍里,根據(jù)起面的循環(huán)圖,c中存放的是255
例2
//輸出結(jié)果是什么?
int main()
{char a[1000];
int i;
for(i=0; i<1000; i++)
{a[i] = -1-i;
}
printf("%d",strlen(a));
return 0;
}
答案是:255
因?yàn)?code>strlen是遇到\0
就結(jié)束,也就是遇到0就結(jié)束a[i]
的值從-1,-2,-3到-128,再到127,126……0
這之間一共有255個(gè)數(shù),所以結(jié)果是255
例3
//輸出結(jié)果是什么?
#includeunsigned char i = 0;
int main()
{for(i = 0;i<=255;i++)
{printf("hello world\n");
}
return 0;
}
答案是:死循環(huán)
因?yàn)檫@里的i
是無符號(hào)的char
,范圍是0 ~255,隨著for循環(huán)的進(jìn)行,當(dāng)i==255
時(shí),再加1,i
變?yōu)?,仍然小于255,所以是死循環(huán)
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧