什么是转换:
(1)转换是将一个类型的值用作另一个类型的等价值的过程。
(2)转换后目标的值与源值一样,但其类型为目标类型。
(3)转换后源值的类型和值都没改变,只是把源值做为目标类型的值来使用。
隐式转换:当从位数更小的源类型转换为位数更大的目标类型的时候,不会丢失数据和精度,语言会自动做这些转换,这叫做隐式转换。
(1)从位数更少的源类型转换为位数更多的目标类型时,目标中多出来的位用0或1填充。
(2)当从更小的无符号类型转换成更大的无符号类型时,目标类型多出来的最高位都用0进行填充,这叫做零扩展。
(3)对于有符号类型的转换,额外的最高位用源表达式的符号位进行填充,,这样就维持了被转换的值的正确符号和大小,这叫做符号扩展。
显式转换:显式转换通过强制转换表达式来实现,当从更大位数类型转换为更小位数类型时,可能会发生数据和精度的损失,C#不会自动进行隐式转换,强制转换表达式构成如下:
目标类型 (sbyte) var1;源表达式 例如:
ushort sh = 1365;
byte sb = (byte)sh;//强制转换
溢出检测上下文:由于显示转换可能丢失数据并且不能在目标类型中同等地表示源值,C#提供了checked运算符和checked语句来在进行类型转换时检测结果溢出。
(1)代码片段是否被检查称作溢出检测上下文。
*如果使用了checked,CLR(Common Language Runtime)会在转换产生溢出时抛出一个OverflowException异常。
*如果代码不是checked,转换会继续而不管是否产生溢出。
(2)默认的溢出检测上下文是不检查的。
checked和unchecked运算符:
checked(表达式) unchecked(表达式)
ushort sh = 2000;
byte sb;
sb = unchecked((byte) sh);//数据丢失
sb = checked((byte) sh);//抛出OverfloeException异常
checked和unchecked语句:与运算符执行相同的功能,只是控制范围变大,可以被嵌套在任意层次。
ushort sh = 2000;
byte sb;
checked
{
unchecked
{
sb = (byte)sh;//数据丢失
}
sb = (byte)sh;//抛出OverflowException异常
}
显式数字转换:在数值型类型间进行的显式转换。
(1)整数到整数间的显式转换:
**在checked的情况下,如果转换丢失数据,操作会抛出一个OverflowException异常。
**在unchecked的情况下,丢失的位不会发出警告。
(2)float或double转到整数类型:
当把浮点类型转换成整数类型时,值会舍掉小数,阶段为最接近的整数。如果截断后的值不在目标类型的范围内:
**在checked的情况下,CLR会抛出OverflowException异常。
**在unchecked的情况下,则C#将不定义它的值是什么。
(3)decimal到整数类型:
当从decimal转换到整数类型时,如果结果值不在目标类型的范围内,则CLR会抛出OverflowException异常。
(4)double到float:
**如果值太小而不能用float表示,那么值会被设置为正0或负0。
**如果值太大而不能用float表示,那么值会被设置为正无穷大或负无穷大。
(5)float或double到decimal:
**如果值太小而不嫩用decimal类型表示,那么值会被设置为0。
**如果值太大,那么CLR会抛出OverflowException异常。
(6)decimal到float或double:
从decimal类型转换到float类型或double类型总是会成功,然而,可能会损失精度。