Java随笔:混合类型表达式类型转换问题

混合表达式处理“坑”很多,看看下面这段代码:

short x = 0;
int y = 123456;
x += y;
System.out.println(x);

按照正常的理解 x+=y 等价于 x = x+y

这里将int型的 y 强转为short型 x,会报告错误:

错误: 不兼容的类型: 从int转换到short可能会有损失

但是,上面的代码居然没有报错。

这里就是混合类型表达式默认进行了一次类型转换,将结果转换为左侧变量的类型,即x类型的short。

由于123456越界了,所以结果就是-7616。

总结

隐藏的类型转换很有可能编译不报错,但实际结果却对数值进行了截断。

当+=左右两边类型不相等时,一定要注意。

时间: 2024-10-19 07:52:11

Java随笔:混合类型表达式类型转换问题的相关文章

【java解惑】条件表达式结果类型规则

如下代码: public class Example008 { public static void main(String[] args) { char x = 'X'; int i = 0; System.out.println(true ? x : 65535); //1 System.out.println(true ? x : 65536); //2 System.out.println(true ? x : i); //3 System.out.println(false ? 0 :

Java随笔:条件操作符之类型推断

条件表达式是常见的一种表达式,看看下面这段代码输出什么? char x = 'X'; int i = 0; System.out.print(true ? x : 0); System.out.print(false ? i : x); 预期是 XX,结果输出的是 X88 这里涉及到混合类型在表达式中的处理: x:0 char:int常量,这时表达式的类型就是char i:x int:char,这时表达式类型是int,计算表达式时对第2个操作符类型进行提升 在计算表达式时,对于混合类型要小心!

Java基本类型与类型转换咋就这么烦?

在Java中一共有8种基本数据类型,其中有4种整型,2种浮点类型,1种用于表示Unicode编码的字符单元的字符类型和1种用于表示真值的boolean类型.(一个字节等于8个bit) 1.整型类型              存储需求     bit数    取值范围      备注int                 4字节           4*8 short             2字节           2*8    -32768-32767long              8字

字符串转换成java.util.date类型和将java.util.date类型转换成java.sql.date类型

//将字符串转换成java.util.date类型 DateFormat format = new SimpleDateFormat("yyyyMMDD"); Date date1 = format.parse(startDate); //将java.util.date类型转换成java.sql.date类型 skg.statStartTime = new java.sql.Date(date1.getTime()); skg.statEndTime = new java.sql.Da

java中运算符与表达式

运算符是用来完成一个动作的特定语言的语法记号. –赋值运算符 –增减运算符 –算术运算符 –关系运算符 –逻辑运算符 -位运算符 运算符 Java 加 + 减 - 乘 * 除 / 取模 % 1.整数运算和小数运算 int n =12 ; int m = 5; float y = n/m; System.out.println(n/m);// 2 System.out.println(n/5.0);// 2.4 System.out.println(12.0/m);// 2.4 System.ou

JDK8的随笔(04)_Lambda表达式扩展之Method References

Method References 方法参照 对于Method Reference了解之前先了解Lambda表达式. 参看: JDK8的随笔(01)_Lambda表达式是个神马东东,初尝禁果 JDK8的随笔(02)_Lambda表达式进一步探讨 JDK8的随笔(03)_Lambda表达式的变量使用范围讨论 Method References 的出现场景 Lambda表达式本身是一个延迟加载采用实现函数式接口的方式来简短代码提高可读性(刚开始可能会降低可读性,熟了就觉得效率很高),减少各种缩进括号

Java 8的类型注解:工具和机会

在以前的Java版本中,开发者只能将注解(Annotation)写在声明中.对于Java 8,注解可以写在使用类型的任何地方,例如声明.泛型和强制类型转换等语句: @Encrypted String data;List strings;myGraph = (@Immutable Graph) tmpGraph; 乍一看,类型注解并不是Java新版本最炫的特性.事实上,注解只是语法!工具决定了注解的的语义(即,它们的含义和行为).本文介绍新的注解语法和实用工具,以提高生产力和构建更高质量的软件.

运算符和表达式(类型转换)

和其他程序设计语言一样,C语言中表示运算的符号称为运算符.运算符是告诉编译程序执行特定算术或逻辑操作的符号,运算的对象称为操作数. 对一个操作数进行运算的运算符称为单目运算符,对两个操作数进行运算的运算符称为双目运算符,三目运算符对三个操作数进行运算.用运算符和括号可以将操作数连接起来组成表达式. C语言提供了40多个运算符,其中一部分跟其他高级语言相同(例如"+"."?"."*"等运算符),另外的与汇编语言类似,对计算机的底层硬件(如指定的物理

Java泛型:类型擦除

类型擦除 代码片段一 Class c1 = new ArrayList<Integer>().getClass(); Class c2 = new ArrayList<String>().getClass(); System.out.println(c1 == c2); /* Output true */ 显然在平时使用中,ArrayList<Integer>()和new ArrayList<String>()是完全不同的类型,但是在这里,程序却的的确确会输