为什么int i = 2147483647 + 1;可以,但byte b = 127 + 1;不可编辑?
MBy*_*ByD 172
常量被计算为整数,因此2147483647 + 1溢出并为您提供一个新的int,它可以赋值给int,同时127 + 1也被评估为int等于128,并且不能赋值byte.
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称之为"扩展"),它确实支持强制.
不,"强制"这个词不需要纠正.它是非常刻意和正确地选择的.从最近的源到手(维基百科):"在大多数语言中,强制一词用于表示隐式转换,无论是在编译期间还是在运行期间." "在计算机科学中,类型转换,类型转换和强制是隐式或明确地将一种数据类型的实体改变为另一种数据类型的不同方式."
作为@MByD的证据:
以下代码编译:
byte c = (byte)(127 + 1);
Run Code Online (Sandbox Code Playgroud)
因为虽然表达式(127 + 1)是int且超出范围关闭byte类型,但结果将被转换为byte.这个表达产生-128.