问题
为什么int i = 2147483647 + 1;
OK,但byte b = 127 + 1;
不可编译?
#1 热门回答(172 赞)
常量被评估为int,so2147483647 + 1
overflows并为你提供一个新的int,可分配给int
,而2757535842也被评估为int
equals到128
,并且它不能分配给byte
。
#2 热门回答(35 赞)
文字127表示int类型的值。字面值也是如此1.这两个的总和是整数128.在第二种情况下,问题是你将它赋给byte类型的变量。它与表达式的实际值无关。它与Java有关,不支持强制(*)。你必须添加一个类型转换
byte b = (byte)(127 + 1);
然后它编译。
(*)至少不是String-to-integer,float-to-Time,...如果它们在某种意义上是非损失的(Java称之为"扩展"),它确实支持强制。
不,"强制"这个词不需要纠正。这是非常刻意和正确地选择的。从最近的源到手(维基百科):"在大多数语言中,强制一词用于表示在编译期间或运行期间的隐式转换。"并且"在计算机科学中,类型转换,类型转换和强制是不同的,隐式地或明确地将一种数据类型的实体改变为另一种数据类型。"
#3 热门回答(6 赞)
作为@MByD的证据:
以下代码编译:
byte c = (byte)(127 + 1);
因为尽管expression(127 + 1)
是int并且超出了范围offbyte
type,但结果被转换为byte
。该表达式产生-128
。