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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张跃峰 中级黑马   /  2015-3-24 12:01  /  2089 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

byte b=1;b=b+1; 这个编译错误,错误的原因是什么呢,有人说是因为编译器无法确定等号右面的b的值,所以报错,也有人说是因为int转byte会有失精度造成的,到底什么原因呢?还是说有别的解释?{:2_41:}

15 个回复

倒序浏览
试试 b+=1 应该就可以了
byte b+=1,  b+=1运算的时候b已经定义成byte变量(相当于强转了) 而byte b=b+1 运算b+1  时b没有被定义,所以不行。
回复 使用道具 举报
本帖最后由 小鹏_sJQBO 于 2015-3-24 13:32 编辑

b是byte型,1是int型,系统运算b+1时,会将b自动提升为int型再同1相加,运算完的结果是int型,再将此结果赋给b,而b是byte型,把int型的值赋给byte型,显然是不行的(int型比byte型占位多,会装不下,也就是说会损失精度),所以会报错。毕老师的视频里有讲这个,仔细看看就明白了
回复 使用道具 举报
因为1的默认类型是int,byte的二进制是1个八位,int是4个八位,运算b+1时,b会有一个自动提升的过程,变成4个八位,计算结果也是4个八位,然后你再把计算结果赋给byte类型的b,就会丢失精度。
回复 使用道具 举报
b+1会默认把运算结果转换成int型
回复 使用道具 举报
这是关于变量类型转换的问题,在java中有总共有两种转换形式,自动转换和强制转换。
在java中,表数范围小的可以直接赋值给表数范围大的,这就是自动转换。如果将表数大的
赋值给表数小的,则需要强制转换(七种基本类型的表数范围你可以百度)。
b定义的是byte类型,但是在参与运算 "b+1"时,因为b是与int类型运算,b自动转换为int类型与"1"进行运算,所以结果是int类型,而b是byte类型,其表数范围比int小,所以结果会报错,你需要对运算结果进行强制转换,才可以将结果赋值给b即:
b=(byte)b+1;
毕老师基础视频的课件里面java基础1,有这方面的讲解,希望对你有帮助,加油
回复 使用道具 举报
byte b=1,  而b=b+1 java会自动类型提升为int,什么是自动类型提升呢,就是占字节少的类型被提升成占字节多的类型,这是默认的,如果你想要byte类型的就必须强制转换  b=(byte)(b+1);
回复 使用道具 举报
强转啊0.0.,结果是int赋给byte强转就可以了
回复 使用道具 举报
等式右边b+1,其中b为byte类型,1为int,相加后变为int 类型,但等式左边是byte,所以类型不同,怎么可以赋值呢
回复 使用道具 举报
本帖最后由 妖妖 于 2015-3-24 19:39 编辑

现在,我们假设byte类型的是10ml的小杯子,int类型的是40ml的中杯子。byte b中的b是byte类型的。而b=b+1中后面的b+1中的1是int类型的,b说byte类型的,我们是不能将40ml的水倒入到10ml的水杯中的,那样水不就溢出了吗,而10ml杯子中的水是可以倒入到40ml的杯子中的,说以说,到我们进行b=b+1的时候,就有一个类型自动提升的过程,,也就是说会将b自动提升到int类型。反过来也不是说不可以,但是会有精度的损失,而且这种转化时强制的,b=(byte)(b+1)
回复 使用道具 举报
byte b=1;//这句话先是说明b是byte类型的
b=b+1;//b是byet类型,而1是一个整数,整数默认是int类型的。而byet和int两种不同的类型,取值范围不同,所以java会提示你错误,如果你一直要执行,可以写成b+=1或者(byte)(b+1);
回复 使用道具 举报
Mra 中级黑马 2015-3-24 21:08:44
12#
java里 计算一般都是以int类型计算的 所以你 b+1 就被提升为int 了  int 的范围比byte大嘛 所以 int的数 转回byte 会有可能丢失精度,  比如  int a =  2222222;  你把他给byte 就会超过访范围啦。
回复 使用道具 举报
lmcci 中级黑马 2015-3-24 21:17:49
13#
整数1默认是int类型。于byte类型相加 提升为int类型与1相加,结果是int类型。赋值给byte类型的变量会出错。
回复 使用道具 举报
Grady 中级黑马 2015-3-24 21:20:33
14#
所有整数默认值是int,b+1类型默认提升为int了。类型不匹配,可以强制转换一下,也可以使用"+=",这个二元运算符-->默认转换成左边的数据类型。
回复 使用道具 举报
在运算的时候 Byte,short,char会自动转换成int类型的
回复 使用道具 举报
就是int转byte会有精度损失造成的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马