C#教学第13讲类型转换1

第13讲类型转换1
视频讲师:陈广老师
  大家好,今天我们来讲一下类型转换。
  在C#中类型转换的机制分为两种:
  ・隐式转换(Implicit Conversions)
  ・显示转换(Explicit Conversions)

  隐式转换不需要指明欲转变的目的类型;而现显示转换明确地使用转换运算符(cast)指定要转换成哪一种类型。
  下面我们用程序来讲解程序的转换:

 

  我们执行编译下,输出的结果是5,没有什么问题。代码中,当把32位的整数赋给64位整数b的时候,其实就已经进行了一个类型的转换,就是把32位的有符号整数转换成64位的有符号整数。这个转换并没有体现在代码上,这个就是一个隐式转化。
  好,现在我们反过来把b赋给a看看会出现什么情况:

 

  编译执行,我们来看下a的结果如何?如图:

  我们看,现在呢提示无法将类型“long”隐式转换为“int”。存在一个显示转换(是否缺少强制转化?)。也就是说上面的代码编译通不过,为什么会这样呢?我们做一下实验:

 

  我们看,long所能存贮的最大的整数值会比int大的很多,毕竟它是用64个位也就是8个字节存储一个整数,所以呢它所能存储的整数范围会大很多。

  而刚才我们的代码把一个范围大的值赋给一个范围小的值int,这时候就有可能造成数据的丢失,所以编译通不过。这时候该怎么办呢?正如刚才我们所讲需要使用显示转换。

  1. a=(int)b;  //显示转换
  2. //显示转化就是在预转化对象b的前面加上括号,要把b转化的类型填入括号中就可以了。显示转换也叫强制转换

  编制执行,没有出错。接下来,我们继续做实验,刚才我们通过代码了解,int的最大值是2147483647,一个10位2开头的数,下面我们把long整型b初期值赋一个11位的数,看看a=(int)b;显示转换会有什么后果:

 

  看看执行是否会出错?如图:

 

  从代码中我们知道b的值明显已经超过了a的承受范围,但是呢现在还是把b赋给了a会发生什么样的后果呢?它并没有报错,但发生了溢出,我们看a的值现在和b的值风牛马不相及,相差非常的远。在程序中,出现这样的错误是非常致命的。但是出现这样的错误,C#并没有发出警告或者发出异常,我们该怎么办呢?

  C#允许编程人员自己处理溢出,checked和unchecked操作符提供了这种灵活性。我们可以利用它们来决定对溢出是否进行检查。

  ・ checked

 ・ unchecked

 ・ checked语句

 ・ unchecked语句

  checked和unchecked是放在表达式前面的,只能作用于一条语句。而如果想作用于多条语句就可以使用checked语句和uncheked语句。好,我们来改写刚才的代码:

 

  好,保存代码执行代码,由于发生了溢出操作,程序报错。如图:

 

  通过checked操作符的使用,我们就可以捕捉到那些溢出的异常了,我们呢必须要对这些异常做处理,捕捉它。

 

  这样,我们编译执行代码后就能捕捉到这个异常并能做相应的处理了。好,我们来看看checked语句的用法:

 

  下面,我们来谈一下Checked和unchecked的使用准则:

 ・ 写代码时,将有可能发生非预期溢出的的代码放到一个checked块中

  也就是说,如果你感觉到这个地方有可能发生溢出,这个时候你就必须把代码放在checked块中。

 ・ 写代码时,将允许发生溢出的代码显示地放到一个unchecked块中

  也就是说,如果某个地方你允许它发生溢出,这个时候你必须要把代码放在unchecked块中,告诉其他程序员:这个地方是可以发生溢出的。

  好,我们继续写程序。现在我们用byte来举例子,我们先来看Byte的最大值是多少:

 

  我们看,Byte的最大值是255,Byte是一个无符号的8位整数。它的取值范围是0~255,这里有一个很有意思的现象,我们来看一下:

 

   我们执行编译代码,看看b的值是否是200。如图:

 

  这时候提醒无法将类型“int”隐式转换为“byte”。这是为什么呢?这是因为在执行算数运算时,比如现在b = b + 100;的加法运算,第一步要求所有操作数都扩展为32位值或者64位值,当你的任何操作数超过32位的时候,这时候才会扩展为64位值。也就是说,这个地方100已经转换为一个32位的整数,这时候把它赋给一个Byte类型的b,自然就不行了。这时候就有必要对其进行显示的转换:

 

 

  这样就没有问题了。当然我们也可以用另外一种方法,有意思的地方也就在这里:

 

  保存代码编译,我们看程序并没有报错,但是b = b + 100;却报错。这个大家也没有必要去深究,知道有这么回事就行了,当然像这种地方很容易出现溢出的地方都需要加上checked块。

  好,这节课的内容先讲到这里。

由快乐乔巴听课摘写笔记

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值