using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _5.数据类型转换 { class Program { static void Main(string[] args) { // 隐式类型转换 { ushort destinationVar; char sourceVar = 'a'; // 下面这条语句把char类型隐式转换成ushort类型。 destinationVar = sourceVar; Console.WriteLine("sourceVar val: {0}", sourceVar); Console.WriteLine("destinationVar val: {0}", destinationVar); } // 显式类型转换 { byte destinationVar; short sourceVar = 7; // 下面这条语句把short类型显式转换成byte类型。 // 如果不强制类型转换,会出现编译错误。 destinationVar = (byte)sourceVar; Console.WriteLine("sourceVar val: {0}", sourceVar); Console.WriteLine("destinationVar val: {0}", destinationVar); } // 表达式的溢出检查上下文 { byte destinationVar; short sourceVar = 281; // byte类型的最大值255,所以此语句进行强制类型转换后会溢出。其结果为25 destinationVar = (byte)sourceVar; // destinationVar = checked((byte)sourceVar); // 上面这条语句进行溢出检查时,会出现OverflowException异常。 // destinationVar = unchecked((byte)sourceVar); // 上面这条语句表示不进行溢出检查和不加此溢出检,查结果是一样的。 Console.WriteLine("sourceVar val: {0}", sourceVar); Console.WriteLine("destinationVar val: {0}", destinationVar); } // 使用Convert类方法进行转换 { bool boolVal = true; double doubleVar = 99.999; string stringResult; string stringVal = "17"; int integerVal = 67; long longResult; stringResult = Convert.ToString(boolVal) + Convert.ToString(doubleVar); Console.WriteLine("stringResult: {0}", stringResult); longResult = integerVal + Convert.ToInt64(stringVal); Console.WriteLine("longResult: {0}", longResult); } Console.ReadKey(); } } } /** * 一、数据类型转换 * 1. 基本概念 * a) 不同类型的变量使用不同的模式来表示数据。 * b) 它们占用的存储空间可能相同,也许目标类型有足够的存储空间包含所有的源数据位,结果也有可能与期望不同。 * * 2. 数据类型转换分类 * 可分为隐式类型转换和显式类型转换。 * * 二、隐式类型转换 * 1. 基本概念 * 从类型A到类型B的转换可以在所有情况下进行,执行转换规则非常简单,可以让编译器执行转换。 * * 2. 隐式转换规则 * 任何类型A,只要其取值范围完全包含在类型B的取值范围内,就可以进行隐式转换为类型B。 * * 3. 基本类型隐式转换表 * 类型 可以安全转换为 * byte short,ushort,int,uint,long,ulong,float,double,decimal * sbyte short,int,long,float,double,decimal * short int,long,float,double,decimal * ushort int,uint,long,ulong,float,double,decimal * int long,float,double,decimal * uint long,ulong,float,double,decimal * long float,double,decimal * ulong float,double,decimal * float double * char ushort,int,uint,long,ulong,float,double,decimal * * bool和string类型没有隐式转换。 * * 三、显式类型转换 * 1. 基本概念 * 从类型A到类型B的转换只能在某些情况下进行,转换规则比较复杂,应进行某种类型的处理。 * * 2. 转换规则 * 强迫数据从一种类型转换为另一种类型。 * 其语法为: * <(destinationType)sourceVar>; * 此种转换只能在某种情况下才是可行的。彼此之间没有关系的类型或根本没有关系的类型不能进行强制转换。 * * 四、表达式的溢出检查上下文 * 1. 简单检查源变量的值,把它与目标变量的取值范围进行比较。 * 2. 迫使系统特别注意运行期间的转换。 * 使用checked和unchecked关键字进行表达式的溢出检查上下文。 * 其使用语法: * checked(expression) <检查表达式是否溢出,如出现溢出情况会抛出OverflowException异常> * unchecked(expression) <对表达式溢出情况不进行检查> * * 五、使用Convert类进行显式转换 * 1. 数值的有效表达方式 * 首先是一个可选符号(加号或减号),然后是0位或多位数字,一个句点后跟一位或多位数字,接着是一个可选的e或E, * 后跟一个可选符号和一位或多位数字(在这个序列之前或之后)和空格。 * * 2. 转换方法 * // 整数类型 * Convert.ToByte(val) val转换为byte * Convert.ToSByte(val) val转换为sbyte * Convert.ToInt16(val) val转换为short * Convert.ToUInt16(val) val转换为ushort * Convert.ToInt32(val) val转换为int * Convert.ToUInt32(val) val转换为uint * Convert.ToInt64(val) val转换为long * Convert.ToUInt64(val) val转换为ulong * * // 浮点类型 * Convert.ToSingle(val) val转换为float * Convert.ToDouble(val) val转换为double * Convert.ToDecimal(val) val转换为decimal * * // 布尔类型 * Convert.ToBoolean(val) val转换为bool * * // 字符类型 * Convert.ToChar(val) val转换为char * * // 字符串类型 * Convert.ToString(val) val转换为string * * 使用以上类型转换方式总是会进行溢出检查,checked和unchecked关键字不起作用。 */