字符型(char)用于儲存字符(character),如英文字母或標點。但是char
類型在內存中并不是以字符的形式儲存,而是以ASII碼的形式儲存,也可以說char
類型儲存的實際上是整數。所以char
類型也被歸類為整形家族。
int main()
{char c = 'A';
printf("%d\n", c);
printf("%c\n", c);
return 0;
}
從上面的代碼可以看出,因為char類型儲存的是整形,所以可以以正數的形式打印出
打開內存窗口,也可以看出char
是以整數的形式存儲:
既然知道char
實際上是整形,所以也可以用int
類型對char
類型賦值
int main()
{char c = 65;
printf("%d\n", c);
printf("%c\n", c);
return 0;
}
以
%d
輸出就是輸出存儲在內存中的整形,以%c
輸出就會輸出初始化時整數對應的ASKII碼字符
其實關于由int
類型對char
賦值,以及對于char
類型之間的運算,其實都會經歷一個操作叫做:整形提升
,整形提升的詳細介紹在另一篇文章里👉點擊跳轉
當聽到char的類型這句話時,第一反應應該會是:“char的類型不就是char嘛”
其實不然,char
類型實際上分區為有符號的signed char
和無符號的unsigned char
你可能對有無符號可能會陌生,對于有無符號我在另一篇文章里詳細介紹了👉點擊跳轉
對于char
的有無符號位比較特殊的是:
char
與signed char
不一定等價char
默認是signed char
還是unsigned char
取決于編譯器char
類型都默認為signed char
char
類型占1個字節,也就是8個比特位
所以char
在內存中以00000000
開始,逐漸遞增,到011111111
,在增加到100000000
,最后到11111111
,如下圖:
對于signed char
來說:
00000000
為0,逐漸遞增到011111111
為127,因為第一位是符號位,所以再+1后的100000000
為負數。
從最下面的開始算,11111111
為-1,向上逐漸遞減,到100000001
時,為-127,所以100000000
為-128。
所以,有符號的char
的取值范圍是:-128 ~ 127
對于unsigned char
來說:
當二進制最高好比特位的數為0時,無符號的char與有符號的char相同,當制最高好比特位的數為1時,因為是無符號的char,所以
100000000
為128,直到11111111
為255
所以,無符號的char
的取值范圍是:0 ~ 255
下面這幅圖可以形象地表示出char類型數據范圍
其實,這個圖還可以體現出
char
類型的“循環”
在給char
類型賦值為超過它的取值范圍的值時,在char
中的會按照圖中的循環方向進行存儲值,這其實是由于整形提升導致的,但是通過照著這個圖會比分析整形提升的過程更方便得出實際char
中的值
int main()
{char c = 129;
printf("%d", c);
return 0;
}
這個程序輸出是-127,而不是129
此代碼中,char
類型默認是有符號的char
,它的取值范圍是-128 ~ 127,但是給c
賦值為129,超出了取值范圍
所以照著圖就可以看出:129超了127兩位,在圖里127向后走兩位就是-127
無符號整形也是如此。
例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
是一個意思,有符號的char
取值范圍是-128 ~ 127,-1在這個范圍中,所以a,b 都輸出 -1
無符號的范圍是0 ~ 255,-1不在這個范圍里,根據起面的循環圖,c中存放的是255
例2
//輸出結果是什么?
int main()
{char a[1000];
int i;
for(i=0; i<1000; i++)
{a[i] = -1-i;
}
printf("%d",strlen(a));
return 0;
}
答案是:255
因為strlen
是遇到\0
就結束,也就是遇到0就結束a[i]
的值從-1,-2,-3到-128,再到127,126……0
這之間一共有255個數,所以結果是255
例3
//輸出結果是什么?
#includeunsigned char i = 0;
int main()
{for(i = 0;i<=255;i++)
{printf("hello world\n");
}
return 0;
}
答案是:死循環
因為這里的i
是無符號的char
,范圍是0 ~255,隨著for循環的進行,當i==255
時,再加1,i
變為0,仍然小于255,所以是死循環
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
當前文章:C語言char類型的存儲-創新互聯
網頁鏈接:http://vcdvsql.cn/article40/dgoeeo.html
成都網站建設公司_創新互聯,為您提供域名注冊、全網營銷推廣、做網站、靜態網站、虛擬主機、品牌網站制作
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯