【发布时间】:2012-05-14 20:53:20
【问题描述】:
问题是:
为什么在这种情况下我会在 Java 中出现编译错误?
byte x = 0;
x = 128;
但这是合法的:
x+= 999l;
我使用eclipse,jdk 7。
谢谢
【问题讨论】:
-
你到底想问什么,除了有一个变量 x 之外,各个代码块没有任何共同点?
-
他的意思是x在第二种情况下也是字节
问题是:
为什么在这种情况下我会在 Java 中出现编译错误?
byte x = 0;
x = 128;
但这是合法的:
x+= 999l;
我使用eclipse,jdk 7。
谢谢
【问题讨论】:
byte 是有符号的,只能保存最大值127 和最小值-128,这就是为什么第一种情况会给你一个编译错误。
第二种情况会编译,因为您添加到“字节”的值会回绕,请注意999 % 128 = 103,它在“字节”的有效范围内
【讨论】:
在你的第一个:
byte x = 0;
x = 128;
字节是有符号整数类型,8位宽,可以表示-128到+127的范围。
x = 128 表示“将x 分配给128”,默认情况下,128 的类型为int,因此您尝试将int 分配给byte,这会导致Possible loss of precision 错误,因为 int 比 byte 宽。要使其正常工作,您必须显式转换 128 的值。
byte x = 0;
x = (byte)128; // x is now -128.
对于您的第二个示例,将值添加到 x 很好,但您只会溢出值。
byte x = 0;
x += 999L; // don't really need the long qualifier here
// x is now -25.
【讨论】:
byte 的范围是 -128 到 127。 this x+= 999l;有效,因为它是复合赋值运算符。看看这里possible same or alike question。
【讨论】:
在第一个语句x = 128 中,由于字节范围在java 中为0-127,因此需要显式转换,因此会出现编译错误。在第二种情况下,它会溢出并转换为字节范围内的 -25。
【讨论】: