问了几个群,没人知道我在问什么!

qq_41626930 2018-03-01 10:02:32
package day002;

public class Demo06 {

public static void main(String[] args) {
byte b=1;
b=b+(byte)1;
System.out.println(b);
}

}
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Type mismatch: cannot convert from int to byte

at day002.Demo06.main(Demo06.java:7)
黑马视频的原代码是 b=b+1,视频老师解释是因为1是int型。
所以我把1转换成了byte,结果还是不行。
请问这里的是不是想说b=b+(byte)1 涉及两个字节的交互,在运算的过程中,计算机自动将结果类型提前转换成了int型。
我本专业机械的,求个我能听懂的解释啊。
...全文
2181 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhtoad 2019-12-03
  • 打赏
  • 举报
回复
楼上很多说的都很对 b+(byte)1 // 这个计算没错,但因为java自动转换,他计算完之后是int类型的 将int类型赋值给byte类型当然会报错
小圣驾临 2018-09-03
  • 打赏
  • 举报
回复
知其然:大致浏览了一下楼上的回答,无可非议,正确 的写法是b = (byte)(b + 1);
知其所以然:首先让我们来理解一下什么是数据类型转换:把某种基本类型的值直接赋给另一种基本类型的变量的方式被称为类型转换。
也就是说,在赋值(=)的操作中才可进行数据类型转换,而b = b + (byte)1;(根据操作符的优先级顺序)是在赋值之前进行数据的类型转换。
实践是检验真理的唯一标准:
alunSemiconductor 2018-09-02
  • 打赏
  • 举报
回复
楼上大家说得都很对。

这个底层的原因,还是因为Java代码编译后是字节码,执行代码靠的是字节码的指令,而Java并没有直接操作像char、byte、short等这些单字节数据类型的计算指令,所以在计算前会转换成自动转换成int类型,然后再进行计算,也就是说,虽然是两个byte类型的数据在计算加法,但是结果其实是存在的int类型,这时候需要把结果强转,否则提示有可能会丢失精度。

楼主想要进一步学习的话,建议翻看一下 Java虚拟机指令集所支持的数据类型 等相关知识,很多问题就明白了
Surrin1999 2018-09-02
  • 打赏
  • 举报
回复
常量相加 则计算是否在被赋值的数的取值范围内 若在则不报错
有一个变量 则类型提升 记得是int以下做加减会提升至int int以上则往参与运算的最高类型提
zhtoad 2018-09-02
  • 打赏
  • 举报
回复
类型转换。 char转int
qq_42917498 2018-09-02
  • 打赏
  • 举报
回复
会自动转成int型
hyhssm 2018-09-01
  • 打赏
  • 举报
回复
java类型自动转换
weixin_42531282 2018-06-24
  • 打赏
  • 举报
回复
我也在学java,这个问题有创讲过,java里数字默认是int类型,+运算里只要有int类型出现就默认整个运算式都是int类型(也就是26楼说的自动类型提升),根据你运算式里b=b+1,b已经是byte类型了,1是int类型,肯定是报错的,byte类型又比int类型小,小类型转大类型必须强制类型转换,正确的算法是b=(byte)(b+1);楼上说的都很有道理~
Sanders_xu 2018-06-23
  • 打赏
  • 举报
回复
两个byte类型的数据相加时,其计算结果会自动转换成int类型,而你这里赋值给byte类型的b,肯定会报错啊,正确的做法是强制类型转换,b =(byte) ( b + 1 );
zhiyuan_v587 2018-06-22
  • 打赏
  • 举报
回复
只要有+号,就会触发自动类型提升,结果就是int型
另外如果想表明1是byte时。可以使用 1b,后面追加b,大小写都行。类似的有,1.0f(float),1L(long);
羽化南山 2018-06-21
  • 打赏
  • 举报
回复
引用 5 楼 qq_38204653 的回复:
b = (byte)( b + 1),这样应该不会错,两个byte类型的相加自动转换为int ,你用byte接收,肯定报错


这个是正确答案。
lei36180 2018-06-21
  • 打赏
  • 举报
回复
楼上很多说的都很对
b+(byte)1 // 这个计算没错,但因为java自动转换,他计算完之后是int类型的
int类型赋值给byte类型当然会报错
卡卡的喵 2018-06-21
  • 打赏
  • 举报
回复
应该这样转换

public static void main(String[] args) {
byte b=1;
b=(byte) (b+1);
System.out.println(b);

}
随缘不随便 2018-06-20
  • 打赏
  • 举报
回复
小的转大的不行 大的可以转小的 int类型可以转Long类型 Long类型不能转int类型
TSAllen 2018-06-20
  • 打赏
  • 举报
回复
编译失败。byte 和int 进行运算,先提升为int然后再运算,最终的结果还是int类型,不能直接赋值给一个数据范围小的byte类型。
以下三种类型。byte/short/char 在发生数学运算时,会自动提升为int类型。
若一定要转化为byte,只能进行强制转化。b = (byte)(b+1);
a278115333 2018-06-20
  • 打赏
  • 举报
回复
java默认整型变量为int类型,就算你声明变量的时候是byte,当‘=’后面的值进行计算的时候,默认计算结果是int类型的,(b=b+(byte)1;)当你把这个值赋给byte变量‘b’的时候,就出现强制转换错误;
解决办法一个是把你的等式变为 b=(byte) (b+1);这样将计算结果强制转换成byte类型,然后就可以赋值给byte类型的变量‘b’了;
另外一个等式就是:b+=1;首先:‘+=’这个公式是java默认强制转换的等式,不管你的类型是什么,计算的时候直接强制赋值给等式左边的变量;
a278115333 2018-06-20
  • 打赏
  • 举报
回复
java默认整型变量为int类型,就算你声明变量的时候是byte,当‘=’后面的值进行计算的时候,默认计算结果是int类型的,(b=b+(byte)1;)当你把这个值赋给byte变量‘b’的时候,就出现强制转换错误;
解决办法一个是把你的等式变为 b=(byte) (b+1);这样将计算结果强制转换成byte类型,然后就可以赋值给byte类型的变量‘b’了;
另外一个等式就是:b+=1;首先:‘+=’这个公式是java默认强制转换的等式,不管你的类型是什么,计算的时候直接强制赋值给等式左边的变量;
a278115333 2018-06-20
  • 打赏
  • 举报
回复
java默认整型变量为int类型,就算你声明变量的时候是byte,当‘=’后面的值进行计算的时候,默认计算结果是int类型的,(b=b+(byte)1;)当你把这个值赋给byte变量‘b’的时候,就出现强制转换错误;
解决办法一个是把你的等式变为 b=(byte) (b+1);这样将计算结果强制转换成byte类型,然后就可以赋值给byte类型的变量‘b’了;
另外一个等式就是:b+=1;首先:‘+=’这个公式是java默认强制转换的等式,不管你的类型是什么,计算的时候直接强制赋值给等式左边的变量;
申码程序 2018-06-20
  • 打赏
  • 举报
回复
这是涉及到类型转换,byte short char 在参与运算的时候 会先转为int运算,所以如果你要的结果是小于int类型的话,就需要强转,另外 b+=1,不需要强转的原因是:+=运算符自带强转功能
hitzsf 2018-06-19
  • 打赏
  • 举报
回复
为毛不试试 b += 1
加载更多回复(14)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧