为什么
int i = 2147483647 + 1;
是正确的,但是 byte b = 127 + 1;
无法编译?常量被解析成整数,所以2147483647 + 1
会导致溢出,并得到一个新的整数。这个新的整数可以赋值给int
类型,而127 + 1
也被解析为int
类型并且等于128
,但它不能被赋值给byte
类型。
int
由于二进制数值提升,数值127只是一个转移注意力的手段。 - starbluewhile 127 + 1 also evaluated as int equals to 128, and it is not assignable to byte.
”,这是否意味着50 + 1将被评估为byte
,因此可以分配给byte
? - Bhushan字面量127表示int类型的值,字面量1也是如此。这两个值的总和是整数128。问题在于第二种情况下,你正在将其赋给一个byte类型的变量。这与表达式的实际值无关。这与Java不支持强制转换(*)有关。你必须添加一个类型转换。
byte b = (byte)(127 + 1);
然后它会被编译。
(*) 至少不是像字符串转整数、浮点数转时间这样的类型。如果它们在某种意义上是非丢失的(Java 称之为 "扩展"),则 Java 支持强制转换。
不,单词 "coercion" 不需要纠正。它被有意地和正确地选择了。根据最接近的来源(维基百科):"在大多数语言中,强制转换一词用于表示在编译或运行时期间进行的隐式转换" 和 "在计算机科学中,类型转换、类型转换和强制转换是将一个数据类型的实体隐式或显式地更改为另一个数据类型的不同方式"。
(byte)(127 + 1)
将128(整数)转换为字节,而这个(byte)127 + 1
将127转换为字节,但再次转换为int,因为它加上1(int),你得到128(int),错误仍然存在。 - MByDbyte c = (byte)(127 + 1);
(127 + 1)
是 int 类型,超出了 byte 类型的范围,所以结果被强制转换为 byte 类型。这个表达式得到的结果是 -128
。JLS3 #5.2 赋值转换
( variable = expression )
另外,如果表达式是 byte、short、char 或 int 类型的常量表达式(§15.28) :
如果变量的类型是 byte、short 或 char,并且常量表达式的值能够被变量的类型表示,则可以使用缩小原始类型转换。
没有这个条款,我们将无法编写:
byte x = 0;
char c = 0;
但是我们应该这样做吗?我认为不应该。在原始类型之间进行转换时存在很多魔法,必须非常小心。我会尽力编写代码来避免这种情况。
byte x = (byte)0;
byte x = 0
没有什么问题,但是我是一名C程序员。 - Grady Playerint i=0L
是非法的。 - irreputable
byte
数据类型如此麻烦?! - BoltClockbyte
,例如在参数中。在这种情况下,不能分配int
值的事实甚至会捕获一些错误。或者在数组中使用byte
来节省空间。我不会仅仅因为一个值恰好适用于一个字节而使用byte
。 - starblue