为什么我没有得到输出,因为byte
值是-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);
}
}
答案 0 :(得分:5)
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;
由于转换范围变窄而编译得很好,如果所有操作数都是表达式中的常量值,则可以编译。
答案 1 :(得分:2)
您必须转为byte
。由于a
和b
的类型为byte,因此Java会将它们转换为int
,然后结果为int
。
byte c = (byte) (a+b);
答案 2 :(得分:1)
编译时间错误,如果我改变了这个
byte c = a + b;
到
byte c = (byte) (a + b);
我得到了输出
30
答案 3 :(得分:1)
更改
byte c = a + b;
到
byte c = (byte)(a + b);
它对我有用。
答案 4 :(得分:0)
Java默认将算术运算的结果转换为int
类型。试试这个:
public static void main(String... s)
{
byte a = 10;
byte b = 20;
byte c = (byte) (a + b);
System.out.println(c);
}
(byte)
将(a + b)返回的int值更改为字节值。通常,这是不可能的,因为int的范围远大于字节的范围,因此会发生精度损失。无论精度如何,使用铸造都会强制转换。
答案 5 :(得分:0)
没有指令集对byte
类型执行操作。相反,int
类型的指令集用于boolean
,byte
,char
和short
类型的操作。http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-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);
答案 6 :(得分:0)
这里发生了什么
byte a = 10;
分配给它的10个字节类型的变量a。
byte b = 20;
分配给它的字节类型的变量b。
byte c = a+b;
a+b
会自动提升为整数,因为现在求和的结果是整数,你不能将整数赋给byte。