char型別的數值轉換

weixin_34119545發表於2017-05-03

在視訊教程中,你已經認識到了數字型別之間、字串和其他型別之間的轉換。而某些時候,我們還需要將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型別後,會在很大程度上解決這一問題。

 

 
 

相關文章