为什么“int i = 2147483647 + 1;”好的,但是“字节b = 127 + 1;”是不可编辑的?

时间:2011-07-31 11:28:43

标签: java byte int

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

4 个答案:

答案 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;