黑马程序员技术交流社区

标题: 请帮忙解答疑惑 [打印本页]

作者: 完美恋爱    时间: 2013-11-5 16:12
标题: 请帮忙解答疑惑
本帖最后由 完美恋爱 于 2013-11-5 20:52 编辑

class aaa
{
        public static void main(String[] args)
        {
                long a = 200;
                int b = 100;
                int c = a + b;
                System.out.println(c);
        }
}

这段代码提示错误是
aaa.java:7: 可能损失精度
找到: long需要: int
疑问:不是说long a  = 100;如果后面不加L或者l的是后就是默认为int类型吗?那么为什么会提示错误呢?


作者: ciowok    时间: 2013-11-5 16:22
错误在第7行,a为long类型,a+b自动提升为long类型,赋值给int类型需要强制类型转换
long a = 200;没问题,200在long的范围之类.
作者: ixiangfeng    时间: 2013-11-5 16:46
提示错误的是哪行啊 看清楚啊兄弟
作者: 涐扪①起奮乧    时间: 2013-11-5 16:58
class aaa
{
        public static void main(String[] args)
        {
                long a = 200;
                int b = 100;
                int c = a + b;
                System.out.println(c);
        }
}

a和b是不同的基本数据类型,当运算的时候会产生自动类型提升,int类型是32个二进制表示的,而long(一般用于天文数据的计算)是大于32位二进制表示的,当a和b运算的时候a的类型会自动提升为long类型继而和long类型的b进行运算,得到的结果c为long类型,里面应该这样写longc=a+b;这样编译后就不会出现问题。我也是初学者,我们一起奋斗---为黑马!!1
作者: mayor125    时间: 2013-11-5 17:09

long a = 200;将变量a定义成long类型,long类型占8个字节。
int b = 100;变量b是int类型占4个字节,当int c = a+b;的时候,变量b会自动提升为long类型(int-->long转换),所以a + b的值是long类型的。然后将结果赋给int型变量c,当然就会出现精度丢失的情况了。

作者: 万青    时间: 2013-11-5 17:17
这里是赋值转换和双目算术提升  
第五行里 是将int型的200自动赋给a并转换为long型 所以 a是long型的
第六行 b是int形
错误的第七行
双目算术提升的要求是
如果有一个操作数是double型 另一个也转换成double型>如果有一个操作数是float型 另一个也转换成float型>如果有一个操作数是long型 另一个也转换成llong型>都转换为int型
所有第七行的a+b都转换为long型     后前面的int将他们的和  c  转换为int型
而long型c要转换为int型c是要损失精度的 long是64位 int32位 意味着long转int将损失前面的32位 系统是不允许的
反之int转换为long则可以 因为只需要在int的32位之前加32个0或者1就行  记住 正是0负是1

作者: 路过    时间: 2013-11-5 17:26
int c=a+b,这句又问题
作者: Uncle.Lee    时间: 2013-11-5 17:42
long型的数据后不加L时,数据仍为long型,但其取值范围却是int型的取值范围;

低精度可以自动向高精度转换,高精度不会自动向低精度转化
long 的 精度比 int 高 所以这条语句  int c = a +  b; 是错误的
有三种解决方法:
1,把 b 的数据类型改成 int;
2,把 c 的数据类型改成 long;
3,对a+b的结果强制转换为 int 如:int c=(int)(a+b);

作者: 何超    时间: 2013-11-5 17:43
int c=a+b出错是因为  a还是long型  虽然你 long a=200没问题  但是 java对于算数运算会自动向高位看齐  Int c=a+b中  高位应该是long 不是int
作者: zy888802    时间: 2013-11-5 17:49
a被自动提升为了long 然后把a+b为long的类型赋值给int不可以的
作者: 帅气的冬瓜    时间: 2013-11-5 18:43
类型转换:   int(c)=(int)(a+b);
   看视频第二天的第一节,基本数据类型,老师有讲到,强制转换!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2