为什么“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并且超出了byte
types的范围,结果被转换为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;