数据类型转换是我们从小学就开始学习的内容,只不过在小学我们称为单位换算。比如一条狗加一匹马等于是多少呢?总不是两条狗或两匹马吧。我们需要把单位转为都可以计算的单位,比如动物。结果就是两只动物。这样的转换,我们称为数据类型转换。
在C#中数据类型转换又分为隐式转换和显式转换。隐式转换是默认的转换,而显式转换就是必须明确说明的转换。
比如¥1+$1的问题,在国际贸易结算中,默认将人民币转换为美元,那计算的结果是¥1+$1=$1.14。但如果在国内贸易结算,就需要明确说明用什么货币基准来转换,如果转为人民币的话就是¥1+$1=¥8。
这两个案例都很明确的说明,在数值的计算过程中,需要单位统一,在软件的开发过程中叫做数据类型一致。
在C#中对数值类型的数据转换规定
数据容量小的类型转换为数据类型大的类型,是隐式转换,其变量中存储的数据值不会受到任何影响和变化。
数据容量大的类型转换为数据类型小的类型,是显式转换,如果远数据中存储的实际值大于目标类型能存储的值范围,则会发生值受损。显式转换又叫强制类型转换。
- static void Main(string[] args)
- {
- int i = int.MaxValue;
- long l = i; //隐式转换 目标类型=源类型值
- i = (int)l; //显式转换 目标类型=(源类型)源类型值
- System.Console.WriteLine(i);
- l = long.MaxValue;
- i = (int)l;
- System.Console.WriteLine(i);
- }
上述代码首先将int的最大值保存在int类型的i中,又将i的值赋值给了long类型的l。由于long类型能存储的范围远远大于int,因此存放在long类型中的值不会受损。
又将l存储的值赋值为i,虽然这个时候l中保存的具体值不超过int的范围,但long类型比int类型大(你可以想象long的盒子比int的盒子大,大盒子哪怕放了一个小东西,但大盒子所占据的空间还是比小盒子大),所以要求显式转换。不过由于具体存的值够int存储,所以值没有受到影响。
最后一次,我们把long类型的最大值赋值为l,又把l赋值为i,int显然没有足够的空间存储赋予的值,这个时候i中的值是多少呢?-1。
为什么是-1?我们来看以下的经典转换
b = (byte)(b + 100);
System.Console.WriteLine(b);
第二行中100是字面量,所以的整数的字面量默认是int类型。byte类型容量小于int类型,应此byte+int的类型转换是将byte显式转换为int,然后两个int类型之和为int,将相加后的值赋值给byte类型的b,就必须要强制类型转换。
得到的结果是44。byte类型的最大值是255,并且从0开始存储。(b+100)超过byte最大值45。结果是44就说明当给予的值超过了当前类型能存储的范围,则C#默认从0重新开始存放值。
对b赋值写成以下格式,不需要显示的声明类型转换,因为+=是赋值运算符。
b += 100;
System.Console.WriteLine(b);