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

short i 6可以,为什么i i + 6就不可以6默认是int型?如果是,为什么shorti6编译不报错6默认是short

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.


大家如果学过c语言就知道,float f=1.23是可以通过编译的。

那么为什么java中要这样定义呢?
1。
对于一个在short范围里面的int 是可以把值赋给它的,不管是不是在定义中。
2。
java中就不容许double值直接赋给float.

那就是编java的人的思路了。
大家可以踊跃的猜一猜,但是没有标准答案哟。
我是这样猜的:
从int 到short 要么不能成功赋值,如果成功赋值后就不会丢失值。

假如设定double可以转到float 的话。就会有三中情况:一,不能成功赋值。二,可以成功赋值,也没有丢失值。三,可以成功赋值,但是丢失了精度,比如:float f = 1.23456789;就得损失后面的几位。为了防止这种不经意的损失,java中就规定了:不容许double值直接赋给float.


其实编程很多地方都是死的,它没有数学那么严格的逻辑要求,别人怎么定义我们就怎么用了,
经常粘牛角尖只会浪费我们越来越多的时间。




[解决办法]
short i = 6 可以,因为6是常量,编译器在编译时就能知道6能不能装到short中
i = i + 6 不可以,因为i是变量,编译器在编译时不知道i多大,当然也不知道i+6多大,当然也就不知道i+6能不能装进short。

再来看
final int i = 6;
short j = i;可以,但把final去掉就不行。
这个例子应该充分说明常量和变量对编译器的区别了

至于
float f = 2.0不行,只能归结于浮点数的特殊性了。

在java中所有直接写的值,比如1,2,,3.0, 'a '。都成为表示值(或字面值或其他什么)
对于不带小数点的数字表示值,一律当成int处理
带小数点的,一律当成double处理
short i = 6
i + 6
i是short,6是int,int+short,表达式上升为int
将int赋值给short肯定通不过编译,除非你做强制类型转换

final short i = 6
i + 6则不同,编译器在编译时就可以确定i + 6 = 12,实际上在最后编译时,此处直接被12替代了。