为什么“int i = 2147483647 1;”OK,但“byte b = 127 1;”是不可编译的?

问题

为什么int i = 2147483647 + 1;OK,但byte b = 127 + 1;不可编译?


#1 热门回答(172 赞)

常量被评估为int,so2147483647 + 1overflows并为你提供一个新的int,可分配给int,而2757535842也被评估为intequals到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并且超出了范围offbytetype,但结果被转换为byte。该表达式产生-128