你不能在小杯中加大价值。嗯,好的,你可以,但你会失去一些。正如我们所说,你会得到溢出。编译器试图帮助防止这种情况,如果它可以从你的代码中告诉你某些东西不适合你正在使用的容器(变量)。
例如,
int x= 24;
byte b= x;
// Won't work!!
现在,字节范围为-128
到127
。现在,我的问题是为什么这不起作用?毕竟,x
的值是24
,而24
肯定足够小以适应字节(可能是一个非常新手级别的问题,但我对此概念感到困惑)
答案 0 :(得分:7)
您知道byte b= x;
等同于byte b= 24;
,智能编译器也可以告诉您,但是以非常精确的方式指定Java以确保所有编译器做同样的事情,并且它不允许编译器注意这种等同性以接受或拒绝该程序。 (不过,他们可以使用它来进行优化。)所有编译器应该知道表达式x
具有静态类型int
,因此它不能保证byte b= x
1}}正在指定byte
范围内的值。
相反,您必须撰写byte b = (byte) x
,明确转换("转换")表达式x
到byte
类型。
(这是静态类型的一般原则 - 对于任何类型系统,类型系统都会拒绝一些其他正确的程序。在这种情况下,类型系统不允许您从{分配{1}} int
没有演员。)
答案 1 :(得分:2)
您需要以这种方式将int类型化为字节:
byte b = (byte) x;
否则编译器会在编译时给出错误 请记住,如果值超出了您存储的原始数据类型的边界,则类型转换会导致数据丢失。