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

2022-08-31 08:37:57

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


答案 1

常量被计算为 ints,因此溢出并为您提供一个新的 int,该 int 可赋值给 ,同时也计算为 等于 ,并且不可赋值给 。2147483647 + 1int127 + 1int128byte


答案 2

文本 127 表示 int 类型的值。文字1也是如此。这两者之和是整数 128。在第二种情况下,问题是您将此分配给字节类型的变量。它与表达式的实际值无关。这与Java不支持强制(*)有关。您必须添加类型转换

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

然后编译。

(*)至少不是字符串到整数,浮点数到时间,...Java确实支持强制,如果它们在某种意义上是非损失的(Java称之为“扩大”)。

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