在Java中不显示加法结果的字节
为什么我没有得到输出,因为字节值是从-128到127,结果是30在Java中不显示加法结果的字节,java,variables,byte,addition,Java,Variables,Byte,Addition,为什么我没有得到输出,因为字节值是从-128到127,结果是30 class test15 { public static void main(String ...s) { byte a = 10; byte b = 20; byte c = a+b; System.out.println(c); } } 编译时与运行时 a、 b是字节,字节没有加法运算符。在运行时,由于a,b不是最终的,所以会进行整数加法
class test15 {
public static void main(String ...s) {
byte a = 10;
byte b = 20;
byte c = a+b;
System.out.println(c);
}
}
编译时与运行时
a、 b是字节,字节没有加法运算符。在运行时,由于a,b不是最终的,所以会进行整数加法,结果是int。您正试图将其分配给一个字节。这会导致编译错误
byte c = (byte)a+b;
作为旁注。尝试将代码更改为
final byte a = 10;
final byte b = 20;
byte c = a + b;
由于缩小了转换范围,因此可以很好地进行编译。如果表达式中的所有操作数都是常量,则这是可能的。CompileTime vs RunTime
a、 b是字节,字节没有加法运算符。在运行时,由于a,b不是最终的,所以会进行整数加法,结果是int。您正试图将其分配给一个字节。这会导致编译错误
byte c = (byte)a+b;
作为旁注。尝试将代码更改为
final byte a = 10;
final byte b = 20;
byte c = a + b;
由于缩小了转换范围,因此编译效果很好。如果表达式中的所有操作数都是常量,则这是可能的。Java默认情况下将算术运算的结果转换为int类型。试试这个:
public static void main(String... s)
{
byte a = 10;
byte b = 20;
byte c = (byte) (a + b);
System.out.println(c);
}
该字节将a+b返回的int值更改为字节值。通常情况下,这是无法做到的,因为int的范围远大于byte的范围,因此会发生精度损失。无论精度如何,使用强制转换都会强制转换。默认情况下,Java会将算术运算的结果转换为int类型。试试这个:
public static void main(String... s)
{
byte a = 10;
byte b = 20;
byte c = (byte) (a + b);
System.out.println(c);
}
该字节将a+b返回的int值更改为字节值。通常情况下,这是无法做到的,因为int的范围远大于byte的范围,因此会发生精度损失。无论精度如何,使用强制转换都会强制转换。如果我更改此选项,编译时错误
byte c = a + b;
byte c = a + b;
到
我得到输出
30
编译时错误,如果我更改此
byte c = a + b;
byte c = a + b;
到
我得到输出
30
改变
到
它适合我。改变
到
它适合我。没有对字节类型执行操作的指令集。相反,int type的指令集用于对boolean、byte、char和short类型的操作。http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.htmljvms-2.11.1 而且 无法将占用更多内存的较大数据类型分配给较小数据类型。这不是由JVM隐式完成的,需要显式强制转换;由程序员执行的强制转换操作 结果将是一个整数。为此,你必须这样做
byte a = 10;
byte b = 20;
byte c = (byte) (a + b); //u will have to typecast int to byte
System.out.println(c);
没有对字节类型执行操作的指令集。相反,int type的指令集用于对boolean、byte、char和short类型的操作。http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.htmljvms-2.11.1 而且 无法将占用更多内存的较大数据类型分配给较小数据类型。这不是由JVM隐式完成的,需要显式强制转换;由程序员执行的强制转换操作 结果将是一个整数。为此,你必须这样做
byte a = 10;
byte b = 20;
byte c = (byte) (a + b); //u will have to typecast int to byte
System.out.println(c);
发生了什么事
byte a = 10;
为其分配了创建的字节类型为10的变量
byte b = 20;
byte c = a+b;
为其分配字节类型为10的变量b
byte b = 20;
byte c = a+b;
a+b自动升级为整数,因为现在求和的结果是整数,所以不能将整数分配给字节。下面是发生的情况
byte a = 10;
为其分配了创建的字节类型为10的变量
byte b = 20;
byte c = a+b;
为其分配字节类型为10的变量b
byte b = 20;
byte c = a+b;
a+b自动升级为整数,因为现在求和的结果是整数,所以不能将整数分配给字节。必须强制转换为字节。由于a和b是byte类型,Java将它们转换为int,然后结果是int
您必须强制转换为字节。由于a和b是byte类型,Java将它们转换为int,然后结果是int
正如你所说,Java将算术运算的结果转换为int类型,默认情况下,所有变量都是long、float、short??或者只是在字节的情况下?正如你所说,Java将算术运算的结果转换为int类型,默认情况下,所有变量都是long、float、short??或者仅仅以字节为例?我知道类型转换的概念,但我不能理解的是,由于字节值是从-128到127的C值,也就是30,那么为什么会出错?因为Java虚拟机就是这样设计的。没有对字节类型执行操作的指令集。相反,int type的指令集用于对boolean、byte、char和short类型的操作。您确定short没有加法运算符吗?我记得short+short在Java7上工作过,但是我的PC上没有Java7。是的,你可以在这里查看JVM规范-第2.11.1节:为什么会被否决?虽然我建议将JVM规范链接添加到答案的主要文本中,而不是将其保留在评论部分,但这个答案是正确的
我无法理解的是,既然字节值是C的-128到127,也就是30,那么为什么会出错呢?因为Java虚拟机就是这样设计的。没有对字节类型执行操作的指令集。相反,int type的指令集用于对boolean、byte、char和short类型的操作。您确定short没有加法运算符吗?我记得short+short在Java7上工作过,但是我的PC上没有Java7。是的,你可以在这里查看JVM规范-第2.11.1节:为什么会被否决?这个答案是正确的,尽管我建议将JVM规范链接添加到答案的主要文本中,而不是让它在注释部分保留。我知道类型转换的概念,但我无法理解的是,由于字节值是C的-128到127值,也就是30,那么为什么会出现错误?因为字节没有附加运算符,如sᴜʀᴇsʜᴀᴛᴛᴀ 说。他的解决方案比我的好,用它来代替。我知道类型转换的概念,但我不能理解的是,既然字节值是C的-128到127值,也就是30,那么为什么会出错?因为字节没有额外的运算符,比如sᴜʀᴇsʜᴀᴛᴛᴀ 说。他的解决方案比我的好,用它代替。因为Java 8,当它们是有效的最终解决方案,并且它们在OP中时就足够了code@msrd0从Java8开始,当它们实际上是最终的,并且在OP中时就足够了code@msrd0