c=c+a 与 c+=a 的区别 java 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 "+"是逻辑运算符,在做byte之间做运算时,如 c = c+b,c+b的运算结果的数据类型会自动转换为了int类型想将int类型转换为byte类型,就会报错:只有 c = (byte)(c+b);就不会出错; c += b;这个运算的,数据类型是以 c的数据类型为标准的。所以不需要转换。 1、c = c + b ;是做了两个动作,先是加法运算,后是赋值运算。在进行加法运算的时候就已经确定了得到的结果是int类型的,所以不能再往c中存放,这样会报损失精度的错误。2、而 c+=b;它只做了一个赋值的过程,可以以byte类型来存放的情况下进行自动转换为byte。 +=有自动转换的功能 将 int 转换为byte 楼上正解,要先转换为int类型运算的,然后再强转 jvm里根本没有int以下的运算器,所有这些运算都是通过i2c、i2b转为int,计算完成后再c2i、b2i的转回来。也就是说你的等式等同于byte c = 2int + 3int;不做强转必然报错啊,你直接用int+int,然后又要求结果是个byte,jvm当然不认识了。+=在编译的时候自带类型转换,不需要再手工添加了。 c=a+b以及c+=b都是赋值表达式,其中c=a+b是简单赋值,c+=b是复合赋值,java语言规范中,复合赋值E1 op = E2等价于简单赋值E1 = (T)((E1)op(E2)),其中T是E1的数据类型,op为操作符 涨姿势了感觉前面几楼都是对的 自己还从来没有想过类似的问题才知道原来jvm中是没有int以下的运算器的 加法运算符运算过后已经自动转换成了int类型 一般来说,a += b 的效率要比 a = a + b要高点。 好厉害。。byte 做运算,可能会产生超出该数据类型的数据。所以在内部加了强转吧。范围 byte [-128,127] 都一样啊,不都是inc或者add么 非常感谢各位的回答,总结一下:class Demo1{ public static void main(String[] args) { byte b=1; /* b=b+1的运算过程为:b+1做加法运算,其中加法运算过程是以int类型为基础的,所以最后的结果就是int。 所以在用=号赋值给b的时候,因为b为byte型,会报错,必须使用强制类型转换 b=(byte)(b+1) */ b=b+1; }}class Demo2{ public static void main(String[] args) { byte b=1; /* b+=1的运算过程为: 1.运算b+1,当然,也是使用int基础运算的,结果也是int 2.运算求和之后,使用强制类型转换,转换的类型就是b的类型,即byte 3.将byte类型的结果赋值给b */ b+=1; }}另外 long tmp=365 * 24 * 60 * 60 * 1000;是错误的,因为会结果溢出的。原因就是加法运算的过程。这样就对了 long tmp=365 * 24 * 60 * 60 * 1000l,就是参加运算的随便一个数为long型 都一样啊,不都是inc或者add么在汇编中,inc要比add效率高丫! 求各路大神们指点下 函数int a(byte ... b)这3个点是什么意思? wireshark 工具使用 我是山区农村的孩子,买不起vs。那么Java+mySQL是免费的把?可以用来开发商业程序把?vs好像不行。 用java处理并输出CSV文件的时候,如何处理需要显示的逗号和双引号? 急求一正则表达式的做法 什么是平台无关性? 透明窗体 ss to 路人甲 :我找了半天也没在jdk的src中找到javac的类啊(sun.tools.javac),你知道在那里吗? jxl进行表格读取 android 开发 项目前期用的32位jdk 后期可以换成64位jdk吗?
想将int类型转换为byte类型,就会报错:只有 c = (byte)(c+b);就不会出错;
c += b;这个运算的,数据类型是以 c的数据类型为标准的。所以不需要转换。
2、而 c+=b;它只做了一个赋值的过程,可以以byte类型来存放的情况下进行自动转换为byte。
也就是说你的等式等同于byte c = 2int + 3int;不做强转必然报错啊,你直接用int+int,然后又要求结果是个byte,jvm当然不认识了。
+=在编译的时候自带类型转换,不需要再手工添加了。
感觉前面几楼都是对的 自己还从来没有想过类似的问题
才知道原来jvm中是没有int以下的运算器的 加法运算符运算过后已经自动转换成了int类型
byte 做运算,可能会产生超出该数据类型的数据。所以在内部加了强转吧。
范围 byte [-128,127]
总结一下:
class Demo1
{
public static void main(String[] args)
{
byte b=1;
/*
b=b+1的运算过程为:b+1做加法运算,其中加法运算过程是以int类型为基础的,所以最后的结果就是int。
所以在用=号赋值给b的时候,因为b为byte型,会报错,必须使用强制类型转换 b=(byte)(b+1)
*/
b=b+1;
}
}
class Demo2
{
public static void main(String[] args)
{
byte b=1;
/*
b+=1的运算过程为:
1.运算b+1,当然,也是使用int基础运算的,结果也是int
2.运算求和之后,使用强制类型转换,转换的类型就是b的类型,即byte
3.将byte类型的结果赋值给b
*/
b+=1;
}
}
另外 long tmp=365 * 24 * 60 * 60 * 1000;是错误的,因为会结果溢出的。原因就是加法运算的过程。
这样就对了 long tmp=365 * 24 * 60 * 60 * 1000l,就是参加运算的随便一个数为long型