隐含强制类型转换——从变量说起

标签: 隐含强制类型转换
9人阅读 评论(0) 收藏 举报
分类:

         隐含强制类型转换:顾名思义,看不见的强制类型转换,关于这个问题,我们先来读懂一句话:

         byte b =3;

         我们知道一个整数的默认类型int类型,没错3是int类型,当把3赋值给b的时候,其实默认有一个强制类型转换,编译器判断3在byte类型的范围之内,强制把3转换成了byte类型,然后赋值给了b。所以这就被称作隐含强制类型转换,下面我们来看一个简单的问题:

                                                                                                                           

        

         如图:上面两段代码的目的是一样的,要把10赋值给byte类型的b,但是结果是图一正确运行,图二报错。为什么呢?

         图一:b=3+7;等号右边的是常量,编译器先计算表达式的结果为10,判断10在byte类型的范围之内,于是就把int类型的值强制转换成byte类型赋给b;

         图二:b=b1+b2; 等号右边是两个变量,但是变量的值是不确定的。编译器无法判断是否超出了byte类型的取值范围,没办法进行强制类型转换,所以出现如图所示的提示:从int转换到byte可能会有损失(如果超出范围,会丢失高位)。

        知道原因之后,我们尝试把byte改成short类型结果也是一样的:

       

     但是我们改成int类型;

    

   输出结果10,是能够运行的,因为int是默认类型,所以不存在隐含强制类型转换的问题,所以编译当然不会报错。

   那么问题又来了:
        short b=3;              与               short b=3;  
        b+=2;                                         b=b+2;

      的区别:

      b+=2是可以编译成功的。+=也是一个赋值运算符,在底层是一个动作并且有一个强制转换的一个过程(不用我们自己强转);

      但是b=b+2;不能编译成功,这是两个动作,先求和再赋值,求和时b自动类型提升,求和结果是int类型,但是因为编译器无法判断数值大小,所以无法为我们强制转换类型,所以编译报错:

     

     虽然我们可以自己写强制转换,但是可能的结果编译器已经告知,可能会丢失精度。

     即   b=(short)(b+2);  总结,如果等号左右两边的类型不匹配:

    (1)如果右边是常量,编译器会判断数值大小是否在范围内,如果在就做强制类型转换,不在就报错;

    (2)如果右边是变量,编译器无法判断数值大小,不会做强制类型转换,会报错(可以自己强制转换);

    (3)+=,-=,*=,/=,%=赋值运算符不管是否在范围内都会做强制类型转换。

    (*^__^*) ——END

转载自: https://blog.csdn.net/pt666/article/details/70471003
查看评论

从Internet说起

​ 我的电脑还没连网,也想过要和Internet连上。听说,网上黄毒众多,还有些革命的器械在传达,这些说法把我吓住了。前些时分有人建议对收集加以限制,我很赞同。说真实的,哪能允许信息...
  • m_mm122
  • m_mm122
  • 2016-10-15 21:26:13
  • 251

JSP技术模型(五)JSP隐含变量

在JSP页面的转换阶段,容器在_jspService()方法中申明并初始化一些变量,可以在JSP页面小脚本中或表达式中直接使用这些变量。 一、JSP页面中可使用的隐含变量 1、applicatio...
  • cl05300629
  • cl05300629
  • 2013-07-31 08:57:02
  • 2228

Java常考面试题4--Java强制类型转换

强制转换
  • HZ_LIZX
  • HZ_LIZX
  • 2017-02-08 16:54:04
  • 736

Java - short s1 = 1; s1 = s1 + 1; 有错吗? short s1 = 1; s1 += 1; 有错吗?

对于 short s1 = 1; s1 = s1 + 1; 由于1是int类型,因此s1+1运算结果也是int 型,需要强制转换类型才能赋值给short型。而 short s1 = 1; s1 += ...
  • chimomo
  • chimomo
  • 2017-10-25 15:35:02
  • 123

make 的隐含规则和隐含变量

隐含规则和隐含变量可以通过make -p -f /dev/null 查看。  # Variables # automatic # automatic ?F = $(notdir $?) # defau...
  • hansel
  • hansel
  • 2011-02-12 03:28:00
  • 1286

Java类型转换之自动类型转换和强制类型转换区别理解总结

Java类型转换之自动类型转换和强制类型转换区别理解总结
  • AnyingVirusKing
  • AnyingVirusKing
  • 2016-11-29 15:45:28
  • 282

C#完全手册 (语言概述 程序设计 面向对象 深入了解c#)

  • 2008年12月11日 20:00
  • 1.2MB
  • 下载

从坚持说起

        我们实验室因为没有安排值日生,所以每天的垃圾都是扔在过道里的各个小的垃圾桶里,然后到周五大扫除时再一起倒掉。最近一段时间呢,有位师弟义务承担起了清洁员的职责,每隔两三天就会主动清理各个...
  • zhangao2004
  • zhangao2004
  • 2010-03-12 23:16:00
  • 160

makefile的使用隐含规则

重新创建目标文件的一些标准方法是经常使用的。例如,一个传统的创建OBJ文件的方法是使用C编译器,如cc,编译C语言源程序。隐含规则能够告诉make怎样使用传统的技术完成任务,这样,当您使用它们时,您就...
  • eroswang
  • eroswang
  • 2007-08-26 17:23:00
  • 2039

【Spark2.0源码学习】-1.概述

【Spark2.0源码学习】-1.概述
  • kezhong_wxl
  • kezhong_wxl
  • 2017-08-22 23:53:20
  • 108
    个人资料
    持之以恒
    等级:
    访问量: 4万+
    积分: 1087
    排名: 4万+