欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文詳解C語言char類型中的存儲

 更新時間:2023年01月09日 11:28:56   作者:Jambo!  
C語言中的char是用于聲明單個字符的關鍵字,這篇文章主要給大家介紹了關于C語言char類型中存儲的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下

char是如何存儲的

字符型(char)用于儲存字符(character),如英文字母或標點。但是char類型在內存中并不是以字符的形式儲存,而是以ASII碼的形式儲存,也可以說char類型儲存的實際上是整數(shù)。所以char類型也被歸類為整形家族。

int main()
{
	char c = 'A';
	printf("%d\n", c);
	printf("%c\n", c);
	return 0;
}

從上面的代碼可以看出,因為char類型儲存的是整形,所以可以以正數(shù)的形式打印出


打開內存窗口,也可以看出char是以整數(shù)的形式存儲:

既然知道char實際上是整形,所以也可以用int類型對char類型賦值

int main()
{
	char c = 65;
	printf("%d\n", c);
	printf("%c\n", c);
	return 0;
}

%d輸出就是輸出存儲在內存中的整形,以%c輸出就會輸出初始化時整數(shù)對應的ASKII碼字符

其實關于由int類型對char賦值,以及對于char類型之間的運算,其實都會經歷一個操作叫做:整形提升,整形提升的詳細介紹在另一篇文章里??點擊跳轉

char的類型

當聽到char的類型這句話時,第一反應應該會是:“char的類型不就是char嘛”

其實不然,char類型實際上分區(qū)為有符號的signed char和無符號的unsigned char

你可能對有無符號可能會陌生,對于有無符號我在另一篇文章里詳細介紹了??點擊跳轉

對于char的有無符號位比較特殊的是:

  • charsigned char不一定等價
  • char默認是signed char還是unsigned char取決于編譯器
  • 在常見的編譯器里,char類型都默認為signed char

char的取值范圍

char類型占1個字節(jié),也就是8個比特位

所以char在內存中以00000000開始,逐漸遞增,到011111111,在增加到100000000,最后到11111111,如下圖:

對于signed char來說:

00000000為0,逐漸遞增到011111111為127,因為第一位是符號位,所以再+1后的100000000為負數(shù)。
從最下面的開始算,11111111為-1,向上逐漸遞減,到100000001時,為-127,所以100000000為-128。

所以,有符號的char的取值范圍是:-128 ~ 127

對于unsigned char來說:

當二進制最高好比特位的數(shù)為0時,無符號的char與有符號的char相同,當制最高好比特位的數(shù)為1時,因為是無符號的char,所以100000000為128,直到11111111為255

所以,無符號的char的取值范圍是:0 ~ 255

下面這幅圖可以形象地表示出char類型數(shù)據(jù)范圍

其實,這個圖還可以體現(xiàn)出char類型的“循環(huán)”
在給char類型賦值為超過它的取值范圍的值時,在char中的會按照圖中的循環(huán)方向進行存儲值,這其實是由于整形提升導致的,但是通過照著這個圖會比分析整形提升的過程更方便得出實際char中的值

int main()
{
	char c = 129;
	printf("%d", c);
	return 0;
}

這個程序輸出是-127,而不是129

此代碼中,char類型默認是有符號的char,它的取值范圍是-128 ~ 127,但是給c賦值為129,超出了取值范圍
所以照著圖就可以看出:129超了127兩位,在圖里127向后走兩位就是-127

無符號整形也是如此。

例題

例1

//輸出什么?
#include <stdio.h>
int main()
{
  char a= -1;
  signed char b=-1;
  unsigned char c=-1;
  printf("a=%d,b=%d,c=%d",a,b,c);
  return 0;
}

在這里charsigned char是一個意思,有符號的char取值范圍是-128 ~ 127,-1在這個范圍中,所以a,b 都輸出 -1

無符號的范圍是0 ~ 255,-1不在這個范圍里,根據(jù)起面的循環(huán)圖,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個數(shù),所以結果是255

例3

//輸出結果是什么?
#include <stdio.h>
unsigned char i = 0;
int main()
{
  for(i = 0;i<=255;i++)
 {
    printf("hello world\n");
 }
  return 0;
}

答案是:死循環(huán)

因為這里的i是無符號的char,范圍是0 ~255,隨著for循環(huán)的進行,當i==255時,再加1,i變?yōu)?,仍然小于255,所以是死循環(huán)

附:關于轉義字符的內容

void main()
{
    //char a = '\'',b='\\',c='\r';//  \是轉義符
    //cout << a << endl;
    //cout << b<< endl;
    //cout << c << endl;
    //int x = 'avb';
    //int y = 'a';
    //int z = 'v';
    //int f = 'b';
    //int h = y*z*f;
}

char a = ‘’’,b=’\’,c=’\r’; \是轉義符

通過轉義符可以得到某些特殊的字符的本身

如果只是簡單賦值如:char ch=‘’‘;想得到一個單引號字符,這樣的操作是無法通過編譯的。

例如我們想要在字符串中輸入一個特殊的名字如:“c++“hm”

如果簡單的寫為:char str[30]={" llj “c++ "hm "};這樣是無法得到正確的答案的

我們需要使用轉義符

char str[30]={" llj \“c++ \"hm "}

這樣使用轉義符,就可以把某些界限符的意義轉為其他含義,如’ ‘是字符的界限符,” “是字符串的界限符。

再舉一個例子:int x='4';那么x的值為字符4對應的ascii值

但是如果寫為 int x=’\4’;那么x的值就為4。

int x="\1\2\3\4\5\6\7"[2];

上面x的值為3;

首先整個字符串通過轉義變?yōu)榱?ldquo;1234567”這樣七個字符,而后面的[2]則是代表著下標訪問第二個數(shù)據(jù),所以得到的剛好是第三個字符3;之所以能訪問是因為,在這個字符串中\(zhòng)1\2\3等每個數(shù)都為一個字節(jié),那么下標2,相當于第三個數(shù),也就是第三個字節(jié)的內容。

總結

到此這篇關于C語言char類型中的存儲的文章就介紹到這了,更多相關C語言char類型存儲內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言實現(xiàn)企業(yè)員工管理系統(tǒng)開發(fā)

    C語言實現(xiàn)企業(yè)員工管理系統(tǒng)開發(fā)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)企業(yè)員工管理系統(tǒng)開發(fā),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • vscode+leetcode環(huán)境配置方法

    vscode+leetcode環(huán)境配置方法

    這篇文章主要介紹了vscode+leetcode環(huán)境配置,本文通過實例圖文相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • C++ 強制類型轉換詳解

    C++ 強制類型轉換詳解

    這篇文章主要介紹的是C++ 強制類型轉換詳解,C語言中的強制轉換主要用于普通數(shù)據(jù)類型、指針的強制轉換,沒有類型檢查,轉換不安全,下面我們來看看其具體語法及詳細內容
    2021-11-11
  • C語言實現(xiàn)英文文本詞頻統(tǒng)計

    C語言實現(xiàn)英文文本詞頻統(tǒng)計

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)英文文本詞頻統(tǒng)計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C++使struct對象擁有可變大小的數(shù)組(詳解)

    C++使struct對象擁有可變大小的數(shù)組(詳解)

    下面小編就為大家?guī)硪黄狢++使struct對象擁有可變大小的數(shù)組(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • 詳解C語言函數(shù)返回值解析

    詳解C語言函數(shù)返回值解析

    這篇文章主要介紹了詳解C語言函數(shù)返回值解析的相關資料,需要的朋友可以參考下
    2017-06-06
  • C語言使用深度優(yōu)先搜索算法解決迷宮問題(堆棧)

    C語言使用深度優(yōu)先搜索算法解決迷宮問題(堆棧)

    這篇文章主要介紹了C語言使用深度優(yōu)先搜索算法解決迷宮問題,涉及C語言堆棧的使用與深度優(yōu)先算法解決迷宮問題的相關操作技巧,需要的朋友可以參考下
    2017-09-09
  • STL各個容器性能詳細比較

    STL各個容器性能詳細比較

    從下面表中的數(shù)據(jù)來看寫入用時vector和deque很快,因為他們內存分配次數(shù)少,關聯(lián)容器和list都是一個一個分配的,一個一個分配也會造成內存碎片,內存利用率低
    2013-09-09
  • C++通過自定義函數(shù)找出一個整數(shù)數(shù)組中第二大數(shù)的方法

    C++通過自定義函數(shù)找出一個整數(shù)數(shù)組中第二大數(shù)的方法

    這篇文章主要介紹了C++通過自定義函數(shù)找出一個整數(shù)數(shù)組中第二大數(shù)的方法,涉及C++針對數(shù)組的遍歷操作相關技巧,需要的朋友可以參考下
    2015-06-06
  • 淺談C#互操作的內存溢出問題

    淺談C#互操作的內存溢出問題

    以前了解過c++的棧內存溢出,沒想到在c#里被我遇到了,問題看似不大,如何被恰好相鄰的四個字節(jié)是返回地址,說不定危害不小??!看來c#的互操作還是得小心為好
    2013-10-10

最新評論