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

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

常量被评估为整数,因此2147483647 + 1溢出并给出一个新的int,可将其指定给int ,而127 + 1也可评估为int等于128 ,并且不能将其指定给byte

字面量127表示types为int的值。 所以文字1.这两个的总和是整数128.在第二种情况下,问题是,你将这个分配给一个字节types的variables。 它与expression式的实际价值无关。 它与Java不支持强制(*)有关。 你必须添加一个types转换

 byte b = (byte)(127 + 1); 

然后编译。

(*)至less不是这种types的string到整数,浮点到时间,… Java确实支持强制,如果它们在某种意义上是非损失的(Java称之为“扩展”)。

不,“强制”这个词不需要纠正。 这是非常慎重和正确的select。 从最接近的来源到维基百科(Wikipedia):“在大多数语言中,词汇强制用于表示在编译期间或运行期间的隐式转换。” 和“在计算机科学中,types转换,types转换和强制是隐式或显式地将一种数据types的实体变为另一种types的不同方式”。

作为@MByD的证据:

以下代码编译:

 byte c = (byte)(127 + 1); 

因为虽然expression式(127 + 1)是int并且超出了bytetypes的范围,结果被转换为byte 。 这个expression式产生-128

JLS3#5.2分配转换

(variables=expression式)

另外,如果expression式是types为byte,short,char或int的常量expression式(第15.28节):

如果variables的types是byte,short或char,并且常量expression式的值可以用variables的types表示,则可以使用缩小的原始转换。


没有这个条款,我们将无法写

 byte x = 0; char c = 0; 

但是,我们应该能够做到这一点? 我不这么认为。 在基元之间有相当多的魔法转化,必须非常小心。 我会尽我所能去写作

 byte x = (byte)0;