目錄:
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字符