C語言char類型及其類型轉換的變化

目錄:

char類型
轉義字符

char類型

首先我們要知道char類型爲一個字節。 而且要知道他在計算機中的儲存方式。 一個字節8個bite,int類型32bite,0x00 00 00 01剛好沒量爲數爲一個字節,這正是內存的儲存方式 例如
char a=5;//a=0000 0101  正數的源碼補碼反碼相同
char b=-5;//  b=1000 0101(源碼)-》1111 1011(補碼)
int x=(int)a;//x=00 00 00 05(16進制),在這裏涉及類型變換時的擴充,當正數擴充時需要在他前面補0
int y=(int)b;//y=ff ff ff fb,負數的擴充則需要在他前面補f

同理類型轉換時有擴充自然也會有縮減,縮減時,只需將多出來的位數刪去就好。
現在我們來看例題

char ch=130;
print("%d",ch);//會輸出-126,這是應爲有符號char的範圍是127到-128
//ch的值超過127時就會自動轉換爲補碼形式,且該值作爲補碼存放
//130=1000 0010(補)單從補碼來看這是一個負數
//那麼他的原碼就是1111 1110(-126)

在例如

char a=100;//a=0110 0100(原,補)
char b=200;//b=1100 1000(補,因爲超過127所以直接作爲補碼處理)
char c=a+b;//a+b時會擴充爲int類型處理再相加,然後在縮減爲char類型
printf("%d,%d",c,a+b);

在這裏插入圖片描述
這個結果不是說明他們兩個的值一定相同,這只是在當前的賦值情況下會出現一樣的結果,實際情況需要計算。
下面來解釋說明
要算a+b所以
a轉換爲int的結果爲
a=0000 0000 0000 0000 0000 0000 0110 0100
b=1111 1111 1111 1111 1111 1111 1100 1000
a+b=1 0000 0000 0000 0000 0000 0000 0010 1100
注意最前面那個1不是符號位,那只是溢出的一位數,真正的符號爲還是第二個0,所以就a+b的int類型結果來說總的結果爲44,同時縮減後變爲char類型的結果是0010 1100=44.
所以兩份結果是這麼得出的。

接着再來看一個例題
先告訴你unsigned char範圍爲0-255

unsigned char x=100;
unsigned char y=200;
unsigned char z=x+y;
printf("%d,%d",z,x+y);

在這裏插入圖片描述
x=0110 0100
y=1100 1000
x+y=
0000 0000 0000 0000 0000 0000 0110 0100
0000 0000 0000 0000 0000 0000 1100 1000
0000 0000 0000 0000 0000 0001 0010 1100
x+y(的int類型結果爲300)
當轉換爲char類型的char時就將前3個字節個去掉了所以剩下了44

關於轉義字符的內容

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;
首先整個字符串通過轉義變爲了“1234567”這樣七個字符,而後面的[2]則是代表着下標訪問第二個數據,所以得到的剛好是第三個字符3;之所以能訪問是因爲,在這個字符串中\1\2\3等每個數都爲一個字節,那麼下標2,相當於第三個數,也就是第三個字節的內容。

關於轉義符的其他用法:
特殊的兩種轉義形式:

\ddd 三位八進制
\xhh 二位十六進制

char *str="dawf\205dfd";
int len=strlen(str);
prinf("%d",len)

len的答案是8,在這\205是一個8進制的數,只有這個數轉化爲十進制後的數不大於255,那麼就可以轉義爲對應8進制值的ascii字符。

char *str="dawf\x20dfd";

這時\x20是一個16進制20的一個數,這是轉義的另一種形式,對應不同的操作符,會有不同的效果,只要它對應的10進制數沒有超過255,那麼就可以轉義爲對應的ascii字符

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章