ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java:自动类型转换

2022-04-22 00:00:38  阅读:184  来源: 互联网

标签:类型转换 short Java int s1 自动 类型 表达式 赋值


规则

自动类型(也叫隐式转换)转换遵循下面的规则:

  1. 若参与运算的数据类型不同,则先转换成同一类型,然后进行运算。

  2. 转换按数据长度增加的方向进行(提升),以保证精度不降低。例如int型和long型运算时,先把int量转成long型后再进行运算。

  3. 所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。

  4. char型和short型参与运算时,必须先转换成int型。

  5. 在赋值运算中,赋值号两边的数据类型不同时,需要把右边表达式的类型将转换为左边变量的类型。如果右边表达式的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度。

下图表示了类型自动转换的规则:

  1. 例子:
  • 对于函数的传参也是一样:
  • 当然,在有函数重载的情况下,java编译器会自动选择最匹配的函数进行调用
  1. Java中整数默认的数据类型是int类型。所有长度低于int的类型(byte、short、char)在运算之后结果将会被提升为int型

对于不符合自动类型转换,需要强制转换才不会报错。

  • 错误:short s1=1;s1=s1+1;
    • 因为short、 int 不会互相转换d,它们在计算时会转换成 int 类型。而“+”是算术运算符,有算术运算符,就是已经在运算了,所以结果会转成int 类型。如果把 int 类型的结果赋给short类型的结果,必须加上强制声明。
  • 正确:short s1=1; s1+=1;
    • 因为“+=”是赋值运算符,不牵涉与其它类型的数字计算,也不会转成 int 类型的,所以没错。
  • 如果你认为表达式(x += i)只是表达式(x = x + i)的简写方式,这并不准确。这两个表达式都被称为赋值表达式。
    第二个表达式使用的是简单赋值操作符(=),而第一个表达式使用的是复合赋值操作符。
    换句话说,复合赋值表达式自动地将所执行计算的结果转型为其左侧变量的类型。如果结果的类型与该变量的类型相同,那么这个转型不会造成任何影响。然而,如果结果的类型比该变量的类型要宽,那么复合赋值操作符将悄悄地执行一个窄化原生类型转换。
    因此,复合赋值表达式可能是危险的。为了避免这种令人不快的突袭,请不要将复合赋值操作符作用于byte、short或char类型的变量。
    因为S1是short型的,占2个字节,而1是int型的,占4个字节。在两个类型的值相加的时候,会发生自动类型的提升。也就是说s1+1后,其结果是int型的,而不是short型的,所以可以想想看,把4个字节的东西放在两个字节的空间里,肯定编译不通过。 后面的那个不会发生类型的提升,JAVA规范上说 e1+=e2 实际上是 e1=(T1)(e1+e2),其中T1是e1的数据类型。 s1+=1等效于 s1=(short)(s1+1),所以是正确的。

参考1
参考2
参考3

标签:类型转换,short,Java,int,s1,自动,类型,表达式,赋值
来源: https://www.cnblogs.com/CodeWater404/p/16177095.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有