6

问题是:

为什么在这种情况下我会在 Java 中出现编译错误?

byte x = 0;
x = 128;

但这是合法的:

x+= 999l;

我使用eclipse,jdk 7。

谢谢你

4

4 回答 4

4

byte有符号并且只能保存 的最大值127和最小值-128,这就是为什么第一种情况会给你一个编译错误。

第二种情况会编译,因为您添加到“字节”的值会环绕,请注意999 % 128 = 103,它在“字节”的有效范围内

于 2012-05-14T20:59:26.653 回答
2

在你的第一个:

byte x = 0;
x = 128;

字节是有符号整数类型,8 位宽,可以表示-128to的范围+127

x = 128表示“分配x128”,默认情况下,128是 type int,所以你试图分配一个intbyte导致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.
于 2012-05-14T21:01:14.663 回答
1

byte 的范围是 -128 到 127。 this x+= 999l; 有效,因为它是复合赋值运算符。看看这里可能相同或相似的问题

于 2012-05-14T21:12:19.233 回答
0

在第一个语句中x = 128,由于字节范围0-127在 java 中,因此需要显式转换,因此会出现编译错误。在第二种情况下,它会溢出并转换为字节范围内的 -25。

于 2012-05-14T21:02:18.340 回答