关于转换的初级问题 short a=1; a=a+1;时会出现损失精度的错误,但a+=1就不会,哪位给俺解释一下他们的区别呗,同学给我说的是地址引用的原因但 我还是不太明白,请详细的说一下呗 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 short 会损失啥精度,说清楚点 a=a+1; 1为int,a+1也为int,把int赋值给short的a,当然是错误的,损失精度的 a+=1要了解jvm内部处理机制,等高手解答 short a=1; 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之间的转换之中应该是没有精度丢失问题的. a=a+1;不是损失精度,是编译错误原因如2楼所说至于a+=1;也不是很清楚内部如何运作 这不就是精度损失嘛,还有,short占2个字节,范围是-2^16 ---- 2^16-1假设加的不是1,是b,你能保证能在这个范围内吗?即使是1,要是a为2^16-1,那也会溢出。 假如表达式是 E1 op= E2 这种样子的(op是运算符,E1、E2是操作数),实际上内部是这样做的 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.2http://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); 所以不会有错误哈 隐式转换了哈 太感谢了,初步明白了,特别是lgg201太感谢大家了,还有那个提供链接的朋友,你的链接全是英文,俺不行啊,呵,有待修练,谢谢!~~~ http://topic.csdn.net/u/20090221/21/52ecaf68-df22-411c-b0c1-176aa110427d.html?seed=17345125246楼牛人给了答案 socket的问题 请问自增运算符++问题 2007年最新技术 这个代码错在哪里。基础篇! 网络编程请教? 一个有关toString()的问题! jBuilder生成的exe文件的图标能改吗?怎么改呢? 在java中能不能调用oracle的package 什么叫内部类和外部类??? 急救,怎样在linux下限制磁盘空间的使用? 程序启动后,每天在特定的时间调用一个方法 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); 所以不会有错误哈 隐式转换了哈
啊,呵,有待修练,谢谢!~~~