六、类型转换——隐式转换(C#)
目录
提示:笔记中的内容是我自己的理解,可能会存在理解错误,也欢迎大家指正\( ̄︶ ̄*\))
1、隐式转换
隐式转换的基本规则:
(1)、不同类型之间可以进行自动转换。
(2)、大范围的数据类型去装载小范围的数据类型。
1.1 相同的大类型之间的转换
1.1.1 有符号的整型变量
1、有符号的整型变量:long、int、short、sbyte
举例:
long l = 1;
int i = 1;
short s = 1;
sbyte sb = 1;
l = i; //正确! 隐式转换(int隐式转换成了long)(可以用大范围的类型去装载小范围的类型)
i = l; //错误! (不能够用小范围的类型去装载大范围的类型)
long l = 1;
int i = 1;
short s = 1;
sbyte sb = 1;
l = i; //正确! 隐式转换(int隐式转换成了long)
l = s; //正确! 隐式转换(short隐式转换成了long)
l = sb; //正确! 隐式转换(sbyte隐式转换成了long)
i = s; //正确! 隐式转换(short隐式转换成了int)
i = sb; //正确! 隐式转换(sbyte隐式转换成了int)
s = sb; //正确! 隐式转换(sbyte隐式转换成了short)
1.1.2 无符号的整型变量
1、无符号的整型变量:ulong、uint、ushort、byte
举例:
ulong ul = 1;
uint ui = 1;
ushort us = 1;
byte b = 1;
ul = ui; //正确! 隐式转换(uint隐式转换成了ulong)
ul = us; //正确! 隐式转换(ushort隐式转换成了ulong)
ul = b; //正确! 隐式转换(byte隐式转换成了ulong)
ui = us; //正确! 隐式转换(ushort隐式转换成了uint)
ui = b; //正确! 隐式转换(byte隐式转换成了uint)
us = b; //正确! 隐式转换(byte隐式转换成了ushort)
1.1.3 浮点数
1、浮点数:decimal、double、float
注意:double类型、float类型无法隐式转换为decimal类型。
举例:
decimal de = 1.1m;
double d = 1.1;
float f = 1.1f;
de = d; //错误!(double类型、float类型无法隐式转换为decimal类型。)
de = f; //错误!(double类型、float类型无法隐式转换为decimal类型。)
decimal de = 1.1m;
double d = 1.1;
float f = 1.1f;
d = f; //正确! 隐式转换(float隐式转换成了double)
1.1.4 特殊类型
1、特殊类型:bool、char、string
注意:“特殊类型” 之间不存在隐式转换。
1.2 不同的大类型之间的转换
比如:“有符号的整型变量” 隐式转换 “无符号的整型变量”、“有符号的整型变量” 隐式转换 “浮点数”…
1.2.1 “有符号整型变量” 隐式转换为 “无符号整型变量”
注意:“有符号整型变量” 是不能隐式转换为 “无符号整型变量”。
原因:“有符号整型变量” 包括正数和负数,而 “无符号整型变量” 只包括正数,则 “有符号整型变量” 的范围要更大,并且隐式转换需要遵循 “大范围的数据类型去装载小范围的数据类型” 的原则。所以 “有符号整型变量” 就不能隐式转换为 “无符号整型变量”。
1.2.2 “无符号整型变量” 隐式转换为 “有符号整型变量”
注意:
1、在 “相同的数据类型” 的情况下,“无符号整型变量” 不能隐式转换为 “有符号整型变量” ,因为 “无符号整型变量” 的取值范围大于 “有符号整型变量”。
2、如果是 “不同的数据类型”,则能将 “无符号整型变量” 隐式转换为 “有符号整型变量”。
比如:“sbyte” 的取值范围为 “-128 ~ 127”,“byte” 的取值范围为 “0 ~ 255”,所以就不能将 “byte” 隐式转换为 “sbyte”。
举例:
//无符号整型变量
byte b2 = 1;
ushort us2 = 1;
uint ui2 = 1;
ulong ul2 = 1;
//有符号整型变量
sbyte sb2 = 1;
short s2 = 1;
int i2 = 1;
long l2 = 1;
i2 = ui2; //错误!(在"相同的数据类型"的情况下,"无符号整型变量"是不能隐式转换为"有符号整型变量")
i2 = b2; //正确!("byte"隐式转换成"int")
1.3 “整型” 隐式转换为 “浮点型”
注意
1:任何类型的整型(包括 “有符号” 和 “无符号”)都可以隐式转换为浮点型。
2:虽然double类型、float类型无法隐式转换为decimal类型。但是任何类型的整型(包括 “有符号” 和 “无符号”)都可以隐式转换为decimal。
举例:
//无符号整型变量
byte b2 = 1;
ushort us2 = 1;
uint ui2 = 1;
ulong ul2 = 1;
//有符号整型变量
sbyte sb2 = 1;
short s2 = 1;
int i2 = 1;
long l2 = 1;
//浮点数
float f2 = 1.1f;
double d2 = 1.1;
decimal de2 = 1.1m;
f2 = l2; //正确!
f2 = i2; //正确!
f2 = s2; //正确!
f2 = sb2; //正确!
f2 = ul2; //正确!
f2 = ui2; //正确!
f2 = us2; //正确!
f2 = b2; //正确!
d2 = l2; //正确!
de = l2; //正确!
de = ul2; //正确!
1.4 “浮点型” 隐式转换为 “整型”
注意:“浮点型” 不能隐式转换为 “整型”。
原因:因为 “整型” 不能存储小数。所以在精度方面,“浮点型” 要高于 “整型”,那么也就可以说是 “浮点型” 的范围要大于 “整型”,所以根据 “大范围的数据类型去装载小范围的数据类型” 的原则,所以 “浮点型” 不能隐式转换为 “整型”。
1.5 特殊类型和其他类型之间的隐式转换
1.5.1 bool类型
1、任何类型的整型(包括 “有符号的整型” 和 “无符号的整型”)、“浮点型”、“string类型”、“char类型” 都不能隐式转换为 “bool类型”。
2、“bool类型” 也不能隐式转换为任何类型的整型(包括 “有符号的整型” 和 “无符号的整型”)、“浮点型”、“string类型”、“char类型”。
1.5.2 char类型
1、任何类型的整型(包括 “有符号的整型” 和 “无符号的整型”)、“浮点型”、“string类型”、“bool类型” 都不能隐式转换为 “char类型”。
2、"char类型"可以隐式转换为 “int类型”、“uint类型”、“long类型”、“ulong类型”、“ushort类型”、“浮点型”。
3、“char类型” 隐式转换成数值类型(部分整型和浮点型)后,对应的数字其实是一个ASCII码。
问题:针对第二点的问题的原因?
原因:“char类型” 之所以能够隐式转换为部分整型和浮点型,是因为 “char类型” 是一个16位无符号整数,用于表示Unicode字符的编码值,取值范围是0 ~ 65535,所以它可以隐式转换为比它宽度更大的数值类型(“int类型”、“uint类型”、“long类型”、“ulong类型”、“ushort类型”)
1.5.3 string类型
1、任何类型的整型(包括 “有符号的整型” 和 “无符号的整型”")、“浮点型”、“bool类型”、“char类型” 都不能隐式转换为 “string类型”。
2、"string类型"不能隐式转换为任何类型的整型(包括 “有符号的整型” 和 “无符号的整型”)、“浮点型”、“bool类型”、“char类型”。