2017年4月27日 星期四

隱含數值轉換表、明確數值轉換表

隱含數值轉換表



From                 轉換型別
sbyte          shortintlongfloatdouble decimal
byte    shortushortintuintlongulongfloatdouble decimal
short        intlongfloatdouble decimal
ushort      intuintlongulongfloatdouble decimal
int       longfloatdouble decimal
uint     longulongfloatdouble decimal
long    floatdouble decimal
ulong           float double decimal
char    ushortint uint longulong float double decimal
float    double




解說:隱含數值為系統能夠「自動」將上表數值轉換。先決條件是,由小轉大
例如:int 轉 long,由於 int 範圍為 -2,147,483,648 到 2,147,483,647
 long 範圍為-9,223,372,036,854,775,808    9,223,372,036,854,775,807

1.故我們可知道由 int 轉 long 是可以被系統默認轉換的。但若是轉浮點數如 double則可能會造成精準度的遺失,因為有小數點。不會有範圍遺失的問題。

2.不存在任何「數值」隱含轉換 到「char」的方式。請注意我說的是 隱含轉換

3.從 浮點型別(float、double)到 128位元的十進位值(decimal)沒有隱含轉換

4.如果常數運算式的值,在目的行別的範圍內,int 型別的常數運算式可以轉換成
sbyte、byte、short、ushort、uint 或 ulong。


例子:

 //宣告型別
int height = 180 ;
int weight = 75 ;

//將 int 型別變數指派給其他變數(如 long,此為隱含轉換)
long h = height ;
long w = weight ;


根據上述,其餘型別亦可直接進行宣告做隱含轉換,請注意是否符合隱含轉換表即可。



明確轉換表




From                 轉換型別

sbyte         byteushortuintulong char
byte          Sbyte char
short         sbyte byte ushort uint ulong char
ushort       sbyte byte short char
int             sbyte  byte short ushort uint ulong `` char
uint           sbytebyte short ushort int char
long     sbyte byte short ushort int uint ulong char
ulong        sbyte byte short ushort int uint long char
char     sbytebyte short
float     sbyte byte short ushort int uint long ulong char decimal
double      sbytebyteshort ushort、 int uintlong ulong char floatdecimal
decimal    sbyte byte short ushort int uint long ulong char float double


解說:超過隱含數值表的範圍,隱含轉換可能無法自動完成轉換的工作,或自動轉換會有錯誤會精度上的誤差,為求正確需明確轉換。


1.不同型別需轉換才能做加減,否則會得到錯誤的答案。

2當decimal值轉換成「整數類型別時」,值會捨入小數點後的數字至零,成為最接近的整數值。如果產生的整數在型別範圍外,就會丟回OverflowException。

3.當 double float 值轉換成「整數類型別」時,值會被截斷。如果產生的整數值超過目的值的範圍,則依據溢位檢查內容來決定結果。已檢查內容會丟出OverflowException。

4.當double 轉換成 float 時,double 會捨入為最接近的 float 值。如果double太小或太大,不適用目的型別,結果將會為零,或無限大。

5.當 float 轉換成 double 時,來源值會轉換為decimal表示,並捨入治罪接近第28位小數位置的數字(或需要的話)。根據來源值會發生兩種結果之一。

來源值太小,無法以decimal表示,結果為零

來源值是NaN(非數字)、無限大或太大,以致無法以decimal表示時,就會丟回OverflowException

6.當decimal 轉換成 float 或 double時,decimal值會捨入為最接近的 double 或 float 值。


例子:

//宣告x,y為不同數值型別
float x = 10000.8f ;
double y = 9999.3d;

//明確將 float 及 double 轉換為 dcimal型別
Response.Write(" x - y  = " + ((decimal)x - (decimal)y) + "<br/>");
Response.Write(" x * y = " + ((decimal)x * (decimal)y) + "<br/>");



從上面這個例子來看,我們可以得知若要明確轉換「值」,則可直接宣告。





萬用型別轉換指令 Convert

若遇到明確、隱含皆無法完成轉換的工作,可改用Convert 指令,只要型別間轉屬是合理的,大多都能完成。

用法:

Convert.ToDateTime 將值轉換為DateTime 。
Convert.ToDecimal 將值轉換為Decimal 。
Convert.ToInt16 將值轉換為16位元,帶正負號的整數。

簡單來說即是Convert.To後面加上你想轉換的型別,後面括號內放入宣告值。
如:Convert.Tostring(i) ;


例子:我想將 int 轉換成 string 的字串型別,但隱含及明確轉換都查不到。

--------(int轉換字串)--------
int i = 100 ;
string myString= (string)i ;
Reponse.Write(myString) ;

--------(字串轉換int)--------

string myString="100" ;
int i =(int)myString ;
Response.Write(i) ;


這樣寫則會失敗。


但若使用Convert,此問題可迎刃而解,字串亦同。
例子如下:

--------(int轉換字串)--------

int i = 100 ;
string myString=Convert.Tostring(i) ;
Response.Write(myString) ;

--------(字串轉換int)--------

string myString="100" ;
int i =Convert.ToInt32(myString) ;
Response.Write(i) ;

如此則可成功轉換





沒有留言:

張貼留言