Java 为什么是;int i=2147483647+;1;&引用;好的,但是;字节b=127+;1;&引用;不可编译吗?
为什么Java 为什么是;int i=2147483647+;1;&引用;好的,但是;字节b=127+;1;&引用;不可编译吗?,java,byte,int,Java,Byte,Int,为什么inti=2147483647+1正常,但字节b=127+1不可编译?常量计算为int,因此2147483647+1溢出并提供一个新的int,可分配给int,而127+1也计算为int等于128,它不可分配给字节文字127表示int类型的值。文字1也表示int类型的值。这两者之和为整数128。在第二种情况下,问题是您正在将其分配给byte类型的变量。它与表达式的实际值无关。它与不支持强制(*)的Java有关。您必须添加一个类型转换 byte b = (byte)(127 + 1); 然后
inti=2147483647+1代码>正常,但字节b=127+1代码>不可编译?常量计算为int,因此2147483647+1
溢出并提供一个新的int,可分配给int
,而127+1
也计算为int
等于128
,它不可分配给字节文字127表示int类型的值。文字1也表示int类型的值。这两者之和为整数128。在第二种情况下,问题是您正在将其分配给byte类型的变量。它与表达式的实际值无关。它与不支持强制(*)的Java有关。您必须添加一个类型转换
byte b = (byte)(127 + 1);
然后进行编译
(*)至少不是字符串到整数,浮点到时间。。。如果强制在某种意义上是非丢失的,Java确实支持强制(Java称之为“扩展”)
不,“胁迫”一词不需要更正。当时,它的选择非常谨慎和正确。从最接近的来源(Wikipedia):“在大多数语言中,强制一词用于表示编译期间或运行期间的隐式转换。”“在计算机科学中,类型转换、类型转换和强制是将一种数据类型的实体隐式或显式更改为另一种数据类型的不同方式。”作为@MByD的证据:
编译以下代码:
byte c = (byte)(127 + 1);
因为尽管表达式(127+1)
是int,并且超出了范围offbyte
type,结果被强制转换为byte
。此表达式产生-128JLS3#5.2赋值转换
(变量=表达式)
此外,如果表达式是byte、short、char或int类型的常量表达式(§15.28):
如果变量的类型是byte、short或char,并且常量表达式的值可以在变量的类型中表示,则可以使用窄化原语转换
没有这个条款,我们就不能写作
byte x = 0;
char c = 0;
但我们能做到这一点吗?我不这么认为。在原语之间的转换过程中有着相当大的魔力,我们必须非常小心。我会不遗余力地写作
byte x = (byte)0;
我也有一个真正的疑问:byte
数据类型为什么如此痛苦?!用有符号而不是无符号的byte
显然是一个设计错误。@BoltClock这只是当你不知道如何正确使用它时的痛苦。@starblue,有没有Java字节类型适用的真实例子?如果有特定的数据将字节定义为字节,然后使用Javabyte
以清晰起见,例如在参数中。在这种情况下,无法分配int
值的事实甚至会捕获一些错误。或者使用byte
来节省数组中的空间。我不会对恰好适合字节的单个值使用byte
。您的代码示例可能应该是e byte b=(byte)127+1;即“将1添加到最大字节值”,您的示例只是将128的int值转换为一个字节值。@NKCSS-我不认为您是对的,这个-(byte)(127+1)
将128(整数)转换为一个字节,而这个(byte)127+1
将127转换为一个字节,但再次转换为int,因为它被添加到了1(int)得到128(整数)错误依然存在。事实上,今天我读了一些Java拼图,包括一个关于这个问题的拼图。请看这里:-拼图3问题是由于二进制数字提升,类型int
,值127
是一个模糊的问题。我更喜欢以无限精度计算常量,并且在int I=214748364时给出一个错误7+1;@MByD:正如你所说,“而127+1也被计算为int等于128,它不可分配给byte.
”,这是否意味着50+1将被计算为byte
,因此可分配给byte
?@10101010-不完全正确。它将被分配给byte,但首先(根据标准)它将被计算为int。至于我们是否能够……我看不出字节x=0有什么问题,但我是一名C程序员。我可能会看到一个反对char C=0的论点,但为什么字节x=0错了呢?这对未经训练的人来说是一种误导,认为他们正在将字节0分配给字节变量。不多在本例中,操作byte/short/char可能会带来危害,但一般来说,由于隐式转换,操作byte/short/char可能会变得非常混乱。它们比人们想象的要复杂得多。我希望代码尽可能清晰,不要为了节省几笔笔划而引入任何不确定性。缩小原语时是否也适用类似规则ive转换是从long到int,例如int i=1+0L?只是询问,因为您引用的文本明确地省略了该大小写。@Erwin否,int i=0L
是非法的。