当前位置: 代码迷 >> J2SE >> short i = 6;可以,为什么i = i + 6;就不可以解决方法
  详细解决方案

short i = 6;可以,为什么i = i + 6;就不可以解决方法

热度:334   发布时间:2016-04-24 14:22:56.0
short i = 6;可以,为什么i = i + 6;就不可以
6默认是int型?如果是,为什么short   i   =   6;编译不报错
6默认是short型?如果是,为什么i   =   i   +   6;编译报错

------解决方案--------------------
i 定义了吗?
------解决方案--------------------
short i = 6;
i = i + 6;
------解决方案--------------------
应该是表达式i+6的类型自动提升为int型了,但是i的类型是short,所以出错。
------解决方案--------------------
short i = 6;
i = i + 6;

就是这2句代码

第二句错误的原因:
i是short 6是int (数字常量都是int型) ,加之前都转成int了,结果当然是int

第一句没错的原因:
6是int类型,i是short类型,本来应该是错的,这种情况编译器自动做了转换,因为编译器能判断6可以精确的转为short ,而 i+6编译器就没办法判断了。
------解决方案--------------------
xyshine(呵呵……) ( ) 信誉:79 2007-07-24 14:48:01 得分: 0


嗯,了解;多谢
那么,float kkk = 1.0;为什么又编译不通过呢?
我们知道1.0默认应该是double类型,按照楼上的说法,编译器不能判断1.0可以精确的转为float?

kkk=1.0f就好了
------解决方案--------------------
因为,float和double这些浮点类型在计算机的表示都是不精确的,因为计算机就只能表达0,1。浮点数的表达都是近似值,因此不管是float到double还是double到float都可能存在转换丢失。
------解决方案--------------------
这只是编辑器的编译规制。
我的理解和treeroot(旗鲁特)正好相反,
一个常数是什么类型,编译的时候就根据它的大小确定了的,只不过编译以后都是用的int类型存储,
比如
byte b=123;
int i=123;

编译器确定123是byte类型,所以两个都是使用的bipush来调入,但是在压栈的时候都是使用的istore。当参与运算的时候,即使是
byte b2=b+b;
也是用的iload来调入数据的。所以运算结果必定是int。

对于float和double,至于为什么无法在编译器来确定输入值是float还是double,我猜想是由于浮点数据的难以比较性所造成的,所有float和double在调入和压栈时都是分开来的。
------解决方案--------------------
应该这样:i = (short)(i + 6);编译就不会报错了
------解决方案--------------------
楼上的说的不错
------解决方案--------------------
short i = 6;这时i定义为short类型;
(i + 6) 的结果默认是int类型,把int直接负值给 i的short类型有冲突!
所以 i=(short)(i+6)正解!
------解决方案--------------------
恩。说得不错。
------解决方案--------------------
我记得short i = 0;i +=6可以编译的,这又是应该怎么理解的呢?
------解决方案--------------------
value转型
------解决方案--------------------
直接在定义时用:
int i=i+6;
是不对的!
知道 "= "运算规则吗?
它是从右到左运算的,所以编译器它没有那么聪明,它不会未卜先知!更不会把0作为初值首先赋值给右边的i.
至于上边他们讨论的类型转换,赋值,以及运算等,最好还是去查一查关于类型转换,定义类型时该注意些什么,什么时候需要强制性转换比较好!
------解决方案--------------------
from Thinking in java:
如果是数据类型 小于 int , 运算时 数据类型会自动转为 int , 自然运行结果也是 int
所以你必须对
i = (short)(i+6);

------解决方案--------------------
有明白了一些!多谢
------解决方案--------------------
应该这样说,系统默认整数是int以及int以下的类型,例如6系统默认是byte型,130系统默认是short型。这样就解释了第一个为什么不出错的问题。

第二种其实是一种语法,在《Java编程思想》第三版中把这种语法叫做晋升,就是byte、short和char型的数据在进行运算时,会自动提升成int。

------解决方案--------------------
short i=3 可以。而i=i+3不可以?
对于一个在short范围里面的int 是可以把值赋给它的,不管是不是在定义中。
例如short i; i=12;这是可以的。但是为什么i=i+3不可以呢?那是因为在编译的时候,编译器
不能确认i+3的值在short范围里面。i+3的值只有在运行的时候程序才能知道它的值。

至于float f=1.23;报错的原因:
这是规定。没有原因,java中就不容许double值直接赋给float.
  相关解决方案