一个简单而有趣的类型转换问题 默认的整数值类型是int,默认的小数值类型是double。
int a = 56; //数值56默认为int类型
double d = 3.14; //数值3.14默认为double类型
下面问题来了:
float f = 3.14; //编译通过不了。因为无法将一个double类型的值赋给一个float类型的变量。
short s = 56; //编译可以通过。这是为什么呢?将一个int类型的值赋给一个short类型的变量不损失精度么?为什么可以通过编译呢?
类型转换基本数据类型
分享到:
------解决方案--------------------
晚上不上线的,刚上来, 不好意思哈, 你这个问题其实涉及到jvm。 jvm是基于栈的机器,几乎所有的指令都与操作数栈相关。栈操作包括把常量压入操作数栈、执行通用的栈操作、在操作数栈和局部变量之间往返传输值。常量值隐含包含在操作码内部。
比如我敲下如下代码编译一下:
int a = 56;
short s = 57;//为了区别于a,这边用57
s = (short)(s+1);//你这里可以试试,不加short会怎样?
s+=1;//这里为什么可以,在反汇编生成的字节码里面就看出来了
double d = 3.14;
float f = 3.15f;//如果不加f 为什么会不过,在字节码里面也可以看到
编译一下, 然后用反汇编器看看java编译器为我们生成的字节码。这样就可以对照源代码和字节码,从而了解很多编译器内部的工作。 反汇编后如图