黑马程序员技术交流社区
标题:
小白提问。关于类型转换的
[打印本页]
作者:
646245771
时间:
2014-4-21 14:25
标题:
小白提问。关于类型转换的
本帖最后由 646245771 于 2014-4-21 16:26 编辑
同样还是看了毕老师的视频,关于类型转换的
byte x = 1;
x = (byte)(x+1);
结果是 x = 2
然后通过延伸
x = (byte)(x)+1;这个是不靠谱的。是因为X本身就是byte类型的,然后这样的强转的没有任何实质性的意义的,自然也就是编译失败,丢失精度。
那么我的问题是,x =x +(byte)(1),为什么也是丢失精度呢?
同样的 还有 x = (byte)(x)+(byte)(1),本人小白,请不要见笑,请大神帮忙详细的解答一下原理。
作者:
你为谁归来
时间:
2014-4-21 14:36
1是int类型,占的字节数和byte不一样。一定要将1转换成byte类型精度当然丢失了。
作者:
646245771
时间:
2014-4-21 14:44
你为谁归来 发表于 2014-4-21 14:36
1是int类型,占的字节数和byte不一样。一定要将1转换成byte类型精度当然丢失了。 ...
只是这样么?我再想想,先谢谢你了。
作者:
646245771
时间:
2014-4-21 14:51
还有没有其他大神的详细讲解{:2_30:} 我想再多听听
作者:
NewDemo
时间:
2014-4-21 15:16
本帖最后由 NewDemo 于 2014-4-21 15:19 编辑
x =x +(byte)(1) 你这样写的不叫类型转,写法只能是这样的x=(byte)(x+1)
byte a = 1;
byte b =1;
byte x = 66;
byte y = 90;
byte c =a +b;//byte类型做 +-*/都会丢失精度,即使都是byte类型都不行 这句话编译不会通过
System.out.println(a+b);//系统进行了强转动作 所以编译可以通过,结果是2
System.out.println(x+y);//系统进行了强转操作,所以结果是156
System.out.println((byte)(x+y));//因为byte的取值范围是-128~127,所以这样的强转就会出现-100的结果
System.out.println((int)(a+b));//这里将类型提升后结果就是156
a+=b;//这句话会自动进行类型提升,所以打印a的结果同样是156
System.out.println(a);
复制代码
下面引用别人的一些经典回答
提升为int,在进行相加。我们下看下边代码:
class Test
{
public static void main(String[] args)
{
byte a=1,b=1;
byte c =a+b;
System.out.println(c);
}
}
[color=rgb(177, 8, 0) !important]
复制代码
编译时就会提示损失精度,需要byte,找到int。
如果是先相加得到结果再提升,此时a+b=2,没有超出byte类型,按理说不应该自动提升数据类型了,但是结果还是提升了。
由此可见,先相加得到结果再提升数据类型 不成立。
另外,提一点,楼主代码中,System.out.println((int)(a+b));结果之所以是-100,是因为楼主采用的是中问字符的括号,因此编译时提示异常,并显示-100,正常情况下,结果仍然是156.
只有在把这个结果强转回byte型时,才会得出-100.
原因是,计算结果是计算结果是int型,是32位,而byte最高只有8位,8为存储的正数最高是127(0111 111),因此存储不下计算结果。
强制转换时会把int型156(0000 0000 0000 0000 0000 0000 1001 1100)的前24位全部忽略掉,变为1001 1100,对应十进制-100.
作者:
陈云阳
时间:
2014-4-21 15:19
沙发说的不味
x = (byte)(x)+(byte)(1) 在底层是是这样运行的 x与1先进行自动提升int类型相加,然后才将x与1分别进行类型转换,这时的转换已经毫无意义 最后将int结果赋予x 自然发生精度丢失
x =x +(byte)(1)也是同理
楼主换一种 x = (byte)(x+1)这样的,这是先将x与1进行相加 得出的结果再强制转换为int类型
作者:
陈云阳
时间:
2014-4-21 15:21
最后一句说错了 得出的结果再强制转换为byte类型
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2