为什么int i = 2147483647 + 1;
可以,但byte b = 127 + 1;
不能编译?
byte
是签名而不是未签名的设计错误。
byte
来简化说明,例如在参数中。在这种情况下,您无法分配int
值的事实甚至会引起一些错误。或用于byte
节省阵列空间。我不会使用byte
恰好适合一个字节的单个值。
为什么int i = 2147483647 + 1;
可以,但byte b = 127 + 1;
不能编译?
byte
是签名而不是未签名的设计错误。
byte
来简化说明,例如在参数中。在这种情况下,您无法分配int
值的事实甚至会引起一些错误。或用于byte
节省阵列空间。我不会使用byte
恰好适合一个字节的单个值。
Answers:
常量被评估为int,因此会2147483647 + 1
溢出并为您提供一个新的int,该int可分配给int
,同时127 + 1
也被评估为int
equals 128
,而不能分配给byte
。
int
归因于二进制数值提升的类型,值127
是红色鲱鱼。
while 127 + 1 also evaluated as int equals to 128, and it is not assignable to byte.
”,这是否意味着50 + 1将被评估为byte
并因此可分配给byte
?
文字127表示类型为int的值。文字1也是如此。这两个的总和是整数128。在第二种情况下,问题是您将其分配给类型为byte的变量。它与表达式的实际值无关。它与Java不支持强制(*)有关。您必须添加类型转换
byte b = (byte)(127 + 1);
然后编译。
(*)至少不是String-to-integer,float-to-Time等类型的Java。如果在某种意义上说是强制性的,则Java确实支持强制性(Java将其称为“扩大”)。
不,“胁迫”一词不需要纠正。为此,它是经过精心设计和正确选择的。从最近的资料来源(维基百科):“在大多数语言中,无论是在编译期间还是在运行期间,胁迫一词都用于表示隐式转换。” 在计算机科学中,类型转换,类型转换和强制转换是将一种数据类型的实体隐式或隐式更改为另一种数据类型的不同方式。”
(byte)(127 + 1)
将128(整数)转换为一个字节,而(byte)127 + 1
将127转换为一个字节,但随后又转换为一个int,因为它已添加到1(int)中,因此您得到128(int)并且错误仍然存在。
JLS3#5.2分配转换
(变量=表达式)
另外,如果该表达式是类型为byte,short,char或int的常量表达式(第15.28节):
如果变量的类型为byte,short或char,并且常量表达式的值可表示为变量的类型,则可以使用缩窄的原始转换。
没有这个子句,我们将无法编写
byte x = 0;
char c = 0;
但是我们应该能够做到这一点吗?我不这么认为。在原语之间进行转换时,发生了很多魔术,必须非常小心。我会尽力写作
byte x = (byte)0;
byte x = 0
但是我还是一个C程序员。
int i=0L
是非法的。
byte
数据类型这么痛苦?