A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 完美恋爱 高级黑马   /  2013-11-5 16:12  /  1305 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 完美恋爱 于 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类型吗?那么为什么会提示错误呢?

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

10 个回复

倒序浏览
错误在第7行,a为long类型,a+b自动提升为long类型,赋值给int类型需要强制类型转换
long a = 200;没问题,200在long的范围之类.
回复 使用道具 举报
提示错误的是哪行啊 看清楚啊兄弟
回复 使用道具 举报
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
回复 使用道具 举报

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,当然就会出现精度丢失的情况了。
回复 使用道具 举报
这里是赋值转换和双目算术提升  
第五行里 是将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:45
7#
int c=a+b,这句又问题
回复 使用道具 举报
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:35
9#
int c=a+b出错是因为  a还是long型  虽然你 long a=200没问题  但是 java对于算数运算会自动向高位看齐  Int c=a+b中  高位应该是long 不是int
回复 使用道具 举报
a被自动提升为了long 然后把a+b为long的类型赋值给int不可以的
回复 使用道具 举报
类型转换:   int(c)=(int)(a+b);
   看视频第二天的第一节,基本数据类型,老师有讲到,强制转换!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马