七、类型转换——显式转换(C#)
目录
提示:笔记中的内容是我自己的理解,可能会存在理解错误,也欢迎大家指正\( ̄︶ ̄*\))
1、显示转换
1.1 括号强转
1、语法:
变量类型 变量名 = (变量类型)变量;
例如:“隐式转换” 是将 “低精度” 转换为 “高精度”,比如可以将 “int类型” 隐式转换为 “long类型”,但不能将 “long类型” 隐式转换为 “int类型”;如果要把 "long类型"转换为 “int类型” 就要用到 “显示转换”。
作用:一般情况下,将 “高精度” 的类型显示转换为 “低精度” 的类型。会存在 “精度问题” 或者 “范围问题”。
1.1.1 “有符号的整型” 之间的显示转换
举例1:
sbyte sb = 1;
short s = 1;
int i = 1;
long l = 1;
s = (short)i; //将"int类型"的"i"强制转换为"short类型"
Console.WriteLine(s);
i = (int)l; //将"long类型"的"l"强制转换为"int类型"
sb = (sbyte)s; //将"short类型"的"s"强制转换为"sbyte类型"
sb = (sbyte)i; //将"int类型"的"i"强制转换为"sbyte类型"
sb = (sbyte)l; //将"long类型"的"l"强制转换为"sbyte类型"
举例2:
用 “括号强转” 可能会出现 “范围问题” 所造成的异常。
sbyte sb = 1;
short s = 1;
int i = 40000;
long l = 1;
s = (short)i;
Console.WriteLine(s);
//输出的结果为:
-25536
原因:因为 “short类型” 的取值范围为:“-32768~32767”。最开始 “i” 为 “int类型” 存放 “40000” 的数值,将 “i” 强制转换为 “short类型” 后,因为 “short类型” 最大只能存储 “32767”,如果存放 “40000” 就会出现 “范围问题” 造成的异常。
1.1.2 “无符号的整型” 之间的显示转换
“无符号的整型” 之间的显示转换的用法与 “有符号的整型” 之间的显示转换的用法是一样的,需要注意 “范围问题”。
举例:
byte b = 1;
uint ui = 1;
b = (byte)ui; //将"uint类型"的"ui"强制转换为"byte类型"
1.1.3 “浮点数” 之间的显示转换
“浮点数” 之间用 “括号强转” 可能会出现 “精度问题” 所造成的异常。
float f = 1.1f;
double d = 1.1234567890123456789f;
f = (float)d; //将"double类型"的"d"强制转换为"float类型"
Console.WriteLine(f);
//输出结果为:
1.1234568
原因:因为 “double类型” 的精度比 “float类型” 高,当 “double类型” 的 “d” 强制转换为 “float类型” 时,会存在精度丢失的情况。
1.1.4 “无符号整型” 和 “有符号整型” 之间的显示转换
举例1:
“无符号整型” 和 “有符号整型” 之间用 “括号强转” 可能会出现 “范围问题” 所造成的异常。
uint ui2 = 1;
int i2 = 1;
ui2 = (uint)i2; //将"int类型"的"i2"强制转换为"uint类型"
i2 = (int)ui2; //将"uint类型"的"ui2"强制转换为"int类型"
举例2:
uint ui2 = 1;
int i2 = -1;
ui2 = (uint)i2;
Console.WriteLine(ui2);
//输出结果为:
4294967295
注意:如果 “有符号整型” 初始值为 “负数”,将其强制转换为 “无符号整型” 时,得到的结果可能有异常。
1.1.5 “浮点数” 和 “整型” 之间的显示转换
举例:
“浮点数” 和 “整型” 之间用 “括号强转” 可能会出现 “精度问题”。
uint ui2 = 1;
int i2 = -1;
i2 = (int)1.64f;
Console.WriteLine(i2);
//输出结果为:
1
注意:将 “浮点数” 强制转换为 “整型” 不存在 “四舍五入” 的情况,会直接抛弃掉小数点后面的小数。
1.1.6 “char类型” 和 “数值类型” 之间的显示转换
举例:
uint ui2 = 1;
int i2 = 1;
//"隐式转换"。将"char类型"的字符"A"隐式转换为"int类型"。所以输出结果是字符"A"的ASCII码。
i2 = 'A';
Console.WriteLine(i2);
//显示转换。前面将字符"A"进行隐式转换,将字符"A"的ASCII码赋值给"i2",再将"i2"显示转换为"char类型",输出结果是ASCII码对应的字符。
char c = (char)i2;
Console.WriteLine(c);
//输出结果为:
65
A
1.1.7 “bool类型” 和 “string类型” 之间的显示转换
注意:“bool类型” 和 “string类型” 不能进行 “显示转换”。
1.2 Parse法
1、作用:将 “字符串类型” 转换为对应的类型。
2、语法:
变量类型.Parse("字符串")
注意:字符串必须能够转换成对应类型,否则会报错;并且还要考虑 “字符串” 的取值范围是否在 “字符串” 转换后对应类型的取值范围内,否则也会报错。
举例1:
string str = "123";
int i4 = int.Parse(str); //正确!
Console.WriteLine(i4);
float i5 = float.Parse("123.45"); //正确!
Console.WriteLine(i5);
int i6 = int.Parse("123.45"); //会报错!
//输出结果为:
123
123.45
原因: 因为字符串 “123.45” 如果想要转换,就要找到对应的类型,字符串 “123.45” 对应的 “float”,就应该转换为 “float”,而如果转换为 “int” 就会出错。
举例2:
short s3 = short.Parse("4"); //正确!
Console.WriteLine(s3);
short s4 = short.Parse("400000"); //会报错!
Console.WriteLine(s4);
原因:因为字符串 “400000” 转换为 “short类型” 后,“s4” 的值就变为 “400000”,而 “short类型” 的取值范围为 “-32768 ~ 32767”,而 “s4” 的取值不在 “short类型” 的范围内,所以会出现报错。
举例3:
bool b1 = bool.Parse("true");
Console.WriteLine(b1);
char c1 = char.Parse("A");
Console.WriteLine(c1);
//输出结果为:
True
A
1.3 Convert法
1、作用:更准确的将各个类型之间进行相互转换。
2、语法:
Convert.To目标类型(变量或常量)
注意:填写的变量或常量的数据类型要和 “目标类型” 一致,否则会出错。
举例1:
int a = Convert.ToInt32("12"); //正确!
Console.WriteLine(a);
int b = Convert.ToInt32("12.23"); //会报错!
Console.WriteLine(b);
原因:因为 “字符串12.23” 对应的是 “float”,而目标类型是 “int”,两者不一致,就会报错。
举例2:
int a = Convert.ToInt32("12");
Console.WriteLine(a);
a = Convert.ToInt32(1.6578f); //将"浮点型"通过Convert方法转换为"整型"时,会"四舍五入"。
Console.WriteLine(a);
//"Convert法"也可以把"bool类型"转成"数值类型"。"true"对应"1";"false"对应"0"。
a = Convert.ToInt32(true);
Console.WriteLine(a);
a = Convert.ToInt32(false);
Console.WriteLine(a);
a = Convert.ToInt32('A');
Console.WriteLine(a);
//输出结果为:
12
2
1
0
65
注意:“Convert法” 的精度比 “括号强转” 好一点,因为 “Convert法” 会四舍五入。
3、“Convert法” 中每一个数据类型所对应的 “目标类型”:
sbyte sb1 = Convert.ToSByte("1");
short s1 = Convert.ToInt16("1");
int i1 = Convert.ToInt32("1");
long l1 = Convert.ToInt64("1");
byte sb2 = Convert.ToByte("1");
ushort s2 = Convert.ToUInt16("1");
uint i2 = Convert.ToUInt32("1");
ulong l2 = Convert.ToUInt64("1");
float f = Convert.ToSingle("13.2");
double d = Convert.ToDouble("13.3");
decimal de = Convert.ToDecimal("13.2");
bool b = Convert.ToBoolean("true");
char c = Convert.ToChar("A");
string str = Convert.ToString(123123);
1.4 “其他类型” 转换为 “string类型”
1、语法:
变量.ToString();
注意:“Convert法” 也可以将 “其他类型” 转换为 “string类型”。
举例1:
string str = 1.ToString();
str = true.ToString();
str = 'A'.ToString();
str = 1.2f.ToString();
int aa = 1;
str = aa.ToString();
bool b = true;
str = b.ToString();
举例2:
当我们进行字符串拼接时,就会自动调用 “ToString方法” 将其转换为 “string类型”。
Console.WriteLine("hello" + 1 + true);
string str = "world" + 1 + true + 1.23;
Console.WriteLine(str);
//输出结果为:
hello1True
world1True1.23