在視訊教程中,你已經認識到了數字型別之間、字串和其他型別之間的轉換。而某些時候,我們還需要將char型別轉換為int型別,或者把int型別轉換為char型別。
這篇文章,將介紹在程式碼中雖然不太常用,但也需要了解的知識。
char轉為int
一個字元 ‘漢’ 怎麼可能轉換為數字呢?
實際上是可以的,在之前的補充資料中已經說到,計算機對字元的儲存,是使用某種編碼規則對應的數字來儲存的。
在C#語言中,使用Unicode編碼來儲存字元。
比如漢字 ‘漢’,對應的Unicode編碼是27721,在計算機記憶體中,將使用汗27721對應的二進位制來儲存。
因此,如果要把 ‘漢’ 轉換為int型別的數字,轉換的結果就是27721。
那使用什麼樣的程式碼來完成該轉換呢?
char型別的任何資料都可以隱式的轉換為int型別。
既然是隱式轉換,所以,下面的程式碼都是正確的:
char c = '漢';
int n = c;
Console.WriteLine(n);
n = 'a';
Console.WriteLine(n);
執行上面的程式碼,會輸出:
27721
97
說明 ‘漢’ 和 ‘a’ 在Unicode編碼中分別是27721和97。
為什麼char型別的資料賦值給int型別的變數可以使用隱式轉換呢?
是因為char型別的資料在記憶體中儲存時使用的是Unicode編碼,Unicode編碼佔16位(兩個位元組),而int型別佔32位(4個位元組)。因此,char型別的資料佔位少,取值範圍小,而int型別的資料佔位多,取值範圍大。所以,這樣的賦值是安全的,不會造成資料丟失,可以隱式轉換。
int轉為char
比如,我有一個int型別的變數27721,我想看看這個數字作為編碼,對應的字元是什麼?
這種情況,就需要把int型別的資料轉換為char型別。
int型別的資料轉換為char型別時必須使用顯示轉換。
為什麼必須使用顯示轉換呢?如果你看懂了char轉為int一節,應該明白原因。
char型別的取值範圍小於int,因此,將取值範圍大的int型別轉換為取值範圍小的char型別是不安全的,所以要用顯示轉換。
下面的程式碼,是檢視27721和97兩個數字所代表的字元:
int n = 27721;
char c = (char)n;
Console.WriteLine(c);
c = (char)97;
Console.WriteLine(c);
字元資料的運算
char型別的資料,在進行數學運算(+、-、*、/、%)時,會將它當做int進行運算,運算的返回型別是int。
也就是說,字元也可以參與數學運算,在運算的時候,會把這個字元的編碼進行運算,運算的返回結果是一個整數int。
比如,’a’+’1’,這個程式碼計算的是’a’的編碼加上’1’的編碼,返回的是編碼相加的整數。’a’的編碼是97,’1’的編碼是49,計算結果是一個int型別的整數146。
下面的程式碼可以很好的說明這一點。
int a = 'a'+'1';
Console.WriteLine(a);
執行後會輸出146。
再比如,想想下面的程式碼執行後會輸出什麼呢?
int a = 'a'+1;
char c = (char)a;
Console.WriteLine(c);
分析一下:
- ‘a’+1,是將a的編碼加上1,結果為98,將98儲存到變數a中。
- 然後,將98轉換為對應的字元,轉換的結果就是字元’b’,將其儲存到變數c中。
- 最後輸出變數c,就輸出了字元b。
char型別的資料,在進行數學運算(+、-、*、/、%)時,會將它當做int進行運算,運算的返回型別是int。這種做法,叫做自動型別提升,實際上,不僅僅是char,取值返回比int型別小的數字型別,比如byte、short,它們也適用於自動提升規則。
比如,兩個byte型別的變數進行數學運算時,也會將它們當做是int型別運算,返回結果也是int。
byte s1 = 2, s2 = 3;
byte s3 = s1 + s2;上面的第二句程式碼會報錯,提示你int無法賦值給byte。就是因為兩個byte的變數s1和s2,在進行數學運算時,會提升為int型別,它們計算的結果是一個int型別,不能隱式轉換賦值給byte型別的變數s3。
之所以這樣做,是因為像byte這些取值範圍很小的型別,如果不提升,它們在運算時經常會導致結果超過其取值範圍,超過的部分丟失掉了,得到了錯誤的資料。而提升為取值範圍更大的int型別後,會在很大程度上解決這一問題。