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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Dark_Knight 中级黑马   /  2014-12-15 11:26  /  1420 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

byte a1 = 1,b1 = 2,n;
               
                n = a1 + b1;
这个为什么会损失精度?

7 个回复

倒序浏览
以前总结的 ,希望对你有所帮助。
其实基本类型的强制转换主要是包括隐式强转,和显示强转,隐式强转就是他自己转的,显示强转就是我们自己手动把类型转化,一般显示强转是因为类型自动隐式强转,如果我们不手动强转是会出现错误的。
下面用几个例子,配合解释下。byte b=4;
b=b+1;//错误,因为右侧变成了int型 ,那么是为什么呐,因为1是int型,占四个八位,b是byte型,占1个八位,他们相加,需要4个八位空间才能容纳下它们的和,所以,右侧隐式强转为int型,然而左侧是byte型,装不下,所以会报错。
b=(char)(b+1);//正确,这个就是显示强转,我们手动把本来是int类型的类型转化为和左侧相同的char型已规避错误;
b+=1;//正确,为什么呐,和上面有什么区别呐,因为这个提前要进行一次判断,就是1是不是在byte范围内,结果是,所以就把1当做byte型,赋给左边。
byte a=3,b=4,c;
c=a+b;//错误,两个byte型相加,不应该还是byte类型?为什么会出现错误呐,这是因为在java中,两个byte相加,为了怕他们的再放到byte中放不下,所以把他们强转为int型,这里的强转是隐式的,然而左边是byte类型数据,所以当然会报错。
c=3+4;//正确,这个为什么会正确呐,右侧不适合上面一样的? 原因是,右侧的和是7,然后他就会判断,7是不是在byte数据类型的范围内,结果是,所以就把7当做是byte类型,直接赋值给左边。所以正确。

int a;
byte b=3,e;
short s=3,t;
e=s+b;//错误
t=s+b;//错误
a=s+b;//正确 这个例子得出一个结论就是,byte类型数据,和别的类型的数据也是会转化为int类型。为什么一个byte类型,和一个short类型会转化为int类型,一个占1个八位,一个占4个八位
              不是应该相加后转化为short类型? 原因是当两个数 相加后也是怕他放不下,所以就转为int,而short就放不下。

byte b=3,e;
float f=3f;
double d=3;
f=b+f;//正确。
d=b+d;//正确。这两个和byte和int相加一样,都是隐式强转为所占空间更大的哪一个数据类型。
所以我们可以得出一个结论就是byte 和别的数据类型的数据相加,如果另一个数据的数据类型<int类型,也就是short ,byte 小于4个八位的数,那么他就会隐式强转为int类型,而和别的相加就会隐式转化为更高位的数据类型。
感觉像关于这样的问题很多,但是大多都差不多,我们不可能一一列举,概括的不是很好,希望对你有所帮助
回复 使用道具 举报
因为系统默认把char,short,byte先转化为int型运算,你的n事byte型的,得加强制转换符。
回复 使用道具 举报
姿_`态 发表于 2014-12-15 12:00
以前总结的 ,希望对你有所帮助。
其实基本类型的强制转换主要是包括隐式强转,和显示强转,隐式强转就是他 ...

笔记这么详尽,不顶不行
回复 使用道具 举报
a1+b1的时候自动提升为int类型了,要想赋值给n就必须向下转型z=(byte)(a1+b1);
回复 使用道具 举报
在运算过程中,运算a1+b1的时候java自动将short、byte、char,默认提升为int型数据进行计算,即a1和b1
回复 使用道具 举报
byte,short,char类型的运算都会先转换成int类型再进行运算,而n是byte类型的,大赋给小肯定会损失精度啊
回复 使用道具 举报
int型,其和也是int型,计算结束后给n赋值,犹豫n是byte型,而结果是int型,无法完成赋值,形象点说int型比成锅,而byte型比成碗,把锅放进碗里是不能实现的。所以java虚拟机在底层编译的时候会无法执行,并提示损失精度
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马