short a=1;
a=a+1;
时会出现损失精度的错误,但a+=1就不会,哪位给俺解释一下他们的区别呗,同学给我说的是地址引用的原因但 我还是不太明白,请详细的说一下呗
a=a+1;
时会出现损失精度的错误,但a+=1就不会,哪位给俺解释一下他们的区别呗,同学给我说的是地址引用的原因但 我还是不太明白,请详细的说一下呗
解决方案 »
- 读取XML 第一次用jdom包 求看写对否,报黄色感叹号,在线等
- Java一个程序
- 一道关于结构体指针的题
- 怎么给一个参数为数组的函数传递参数
- 找“Java Servlet编程(第二版)” 这本书那里有下
- 难道没有人可以解决我的问题吗? 高手在哪啊
- Execute()有参数与无参数,ExecuteQuery()有参数与无参数,ExecuteUpdate()有参数与无参数各有什么区别?
- msdn资料在哪里?
- 谈论关于Java单元测试的问题
- 请问谁使用过com.l2fprod.gui.plaf.skin.SkinLookAndFeel风格!!!!
- 程序启动后,每天在特定的时间调用一个方法
- java中如何获取本地服务器的端口使用状态?
要了解jvm内部处理机制,等高手解答
a=a+1; 还是内存分析:
short a=1;
a=a+1;
//内存里有一个a,在运算的时候,又创建了一个临时变量,其值为short型的1;
//也就是说这个运算实际上是在做 a /*int*/ = a /*short*/ + 1 /*int*/ 1是int型这个是因为对整数类型都默认为int型.
//这样我们就很容易看出来产生了类型不符的错误.short a=1;
a+=1;//这里则直接把a的值增加1.//注:类型不匹配的问题.-128 到 127之间的整数在short和int之间的转换之中应该是没有精度丢失问题的.
不是损失精度,是编译错误
原因如2楼所说
至于a+=1;也不是很清楚内部如何运作
这不就是精度损失嘛,还有,short占2个字节,范围是-2^16 ---- 2^16-1
假设加的不是1,是b,你能保证能在这个范围内吗?即使是1,要是a为2^16-1,那也会溢出。
实际上内部是这样做的 E1 = (T)((E1) op (E2)),其中 T 表示 E1 的类型。比如:
short x = 3;
x += 4.6;内部是这样工作的:
short x = 3;
x = (short)(x + 4.6);这里面还有很多细节问题,具体详见 Java Language Specification §15.26.2
http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.26.2
在JVM内部 处理如下:
E1 op= E2 => E1 = (T)((E1) op (E2))所以 short xx = 1;
xx += 1; <==> xx = (short)(xx + 1); 所以不会有错误哈 隐式转换了哈
啊,呵,有待修练,谢谢!~~~