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

gok*_*oku 126 java int byte

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

MBy*_*ByD 172

常量被计算为整数,因此2147483647 + 1溢出并为您提供一个新的int,它可以赋值给int,同时127 + 1也被评估为int等于128,并且不能赋值byte.

  • 实际上,今天我读了一些**Java益智游戏**,其中包括一个谜题......见:http://www.javapuzzlers.com/java-puzzlers-sampler.pdf- puzzle 3 (10认同)
  • 由于二进制数字促销,问题是类型`int`,值`127`是红鲱鱼. (3认同)
  • @10101010 - 不完全是。它将可分配给 byte,但首先(根据标准)它将被评估为 int。 (2认同)

Erw*_*out 35

文字127表示int类型的值.字面值也是如此1.这两个的总和是整数128.在第二种情况下,问题是你将它赋给byte类型的变量.它与表达式的实际值无关.它与Java有关,不支持强制(*).你必须添加一个类型转换

byte b = (byte)(127 + 1);
Run Code Online (Sandbox Code Playgroud)

然后它编译.

(*)至少不是String-to-integer,float-to-Time,...如果它们在某种意义上是非损失(Java称之为"扩展"),它确实支持强制.

不,"强制"这个词不需要纠正.它是非常刻意和正确地选择的.从最近的源到手(维基百科):"在大多数语言中,强制一词用于表示隐式转换,无论是在编译期间还是在运行期间." "在计算机科学中,类型转换,类型转换和强制是隐式或明确地将一种数据类型的实体改变为另一种数据类型的不同方式."

  • @NKCSS - 我不认为你是对的,这个 - `(字节)(127 + 1)`把128(整数)转换成一个字节,而这个`(字节)127 + 1`把127转换成一个字节,但后来又一个int,因为它被添加到1(int)并且你得到128(int)并且错误保持不变. (6认同)

Ale*_*exR 6

作为@MByD的证据:

以下代码编译:

byte c = (byte)(127 + 1);
Run Code Online (Sandbox Code Playgroud)

因为虽然表达式(127 + 1)是int且超出范围关闭byte类型,但结果将被转换为byte.这个表达产生-128.