为什么int i = 2147483647 + 1;
可以,但byte b = 127 + 1;
不可编辑?
答案 0 :(得分:172)
常量被评估为整数,因此2147483647 + 1
溢出并为您提供一个新的int,可分配给int
,而127 + 1
也被评估为int
等于{ {1}},并且不能分配给128
。
答案 1 :(得分:35)
文字127表示int类型的值。字面值也是如此1.这两个的总和是整数128.在第二种情况下,问题是你将它赋给byte类型的变量。它与表达式的实际值无关。它与Java有关,不支持强制(*)。你必须添加一个类型转换
byte b = (byte)(127 + 1);
然后编译。
(*)至少不是String-to-integer,float-to-Time,...如果它们在某种意义上是非损失的,Java确实支持强制(Java称之为“扩展”)
不,“胁迫”这个词不需要纠正。它是非常刻意和正确地选择的。从最近的源到手(维基百科):“在大多数语言中,强制一词用于表示 隐式 转换,无论是在编译期间还是在运行期间。”并且“在计算机科学中,类型转换,类型转换和强制是 不同的 方式,隐式或显式地将一种数据类型的实体更改为另一种数据类型。”。
答案 2 :(得分:6)
作为@MByD的证据:
以下代码编译:
byte c = (byte)(127 + 1);
因为尽管表达式(127 + 1)
是int且超出byte
类型的范围,但结果会转换为byte
。该表达式生成-128
。
答案 3 :(得分:3)
JLS3#5.2分配转换
(变量=表达式)
此外,如果表达式是byte,short,char或int类型的常量表达式(第15.28节):
如果变量的类型是byte,short或char,则可以使用缩小的基元转换,并且常量表达式的值可以在变量的类型中表示。
如果没有这个条款,我们将无法编写
byte x = 0;
char c = 0;
但我们能做到这一点吗?我不这么认为。原语之间的转换有相当大的魔力,必须非常小心。我会不遗余力地写
byte x = (byte)0;