前言
隐式转换(Implicit conversion)是一种编程语言的特性,指的是在特定的条件下,编译器自动将一种类型的值转换为另一种类型的值,而无需手动进行显式类型转换。
隐式转换通常用于以下两种情况:
-
类型之间的兼容性:当一个表达式需要的是某种类型的值,而实际给定的是另一种类型的值时,编译器会自动进行类型转换,以满足表达式的要求。
-
扩展功能:通过定义特定的隐式转换函数,可以使一种类型具备另一种类型的功能,从而扩展了该类型的功能性。
在一些编程语言中,特定的规则和限制被定义用于指定何时和如何进行隐式转换。这些规则通常基于类型的层次结构和类型间的关系,例如继承关系,接口实现等。
需要注意的是,隐式转换虽然方便,但也可能导致一些问题,例如类型不明确、代码可读性差等。因此,在使用隐式转换时,应该谨慎考虑其使用场景和可能导致的潜在问题。
各种类型的范围
在C#中,各种变量类型的存储范围如下:
-
bool: 1个字节,只能存储true或false的布尔值。
-
byte: 1个字节,存储无符号的8位整数,取值范围是0~255。
-
sbyte: 1个字节,存储有符号的8位整数,取值范围是-128~127。
-
char: 2个字节,存储16位Unicode字符,取值范围是 '\u0000'到'\uffff'。
-
short: 2个字节,存储有符号的16位整数,取值范围是-32,768~32,767。
-
ushort: 2个字节,存储无符号的16位整数,取值范围是0~65,535。
-
int: 4个字节,存储有符号的32位整数,取值范围是-2,147,483,648~2,147,483,647。
-
uint: 4个字节,存储无符号的32位整数,取值范围是0~4,294,967,295。
-
long: 8个字节,存储有符号的64位整数,取值范围是-9,223,372,036,854,775,808~9,223,372,036,854,775,807。
-
ulong: 8个字节,存储无符号的64位整数,取值范围是0~18,446,744,073,709,551,615。
-
float: 4个字节,存储32位浮点数,取值范围是-3.4028235E+38~3.4028235E+38。
-
double: 8个字节,存储64位浮点数,取值范围是-1.79769313486232E+308~1.79769313486232E+308。
-
decimal: 16个字节,存储128位十进制数,取值范围是±1.0 × 10^-28 ~ ±7.9 × 10^28。
-
string: 多个字符,存储一串字符。
-
char:单个字符;
这是我们再变量中没有提及的,因为博主觉得在这里写出方便大家阅读和对比,接着我们就要来讲一下隐式替换的基本原则。
1.相同大类型之间的转换
原则:大范围装小范围
例子:
///int 隐式转换成long
long l=1;
int i=1;
l=i;
存储关系示例(箭头指向为可以存储):
整数类型:long->(u)int->(u)short->(u)byte
浮点数:double->float
tips:decimal这个类型不能隐式转换,特殊类型也不存在隐式转换
2.不同大类型之间的转换
原则1:无符号装有符号,有符号不能隐式转换成无符号
原则2:有符号装无符号时,无符号的范围要小于有符号的。
3.浮点数装整数
浮点数可以装载任何类型的整数!
tips:decimal不能隐式存储float和double,但是可以隐式转换存储整型
4.整数不能隐式转换装浮点数
5.特殊和其他类型的隐式转换
bool | 不能和其他类型相互隐式转换 |
char | 没有办法隐式转换存储其他类型,但是可以被其他类型存储,转换为一个asc码 |
string | 同bool |
总结
隐式转换在实际的开发中用的比较少,但是希望大家也能记住一些,我们学习的更多是计算机对数字处理的一种思想,这种思想其实在大部分后续的知识中都是有体现的。
所有知识不是说不用则不取,我们学习什么东西,都要系统地去了解,这样你的大脑框架才算完整。你对语言的理解才算深入。
下一节我们会讲解显式转换,在实际开发中使用会更多。
最后,希望大家在学习的路上戒躁戒躁,一步一个脚印。
共勉。