问题是:
为什么在这种情况下我会在 Java 中出现编译错误?
byte x = 0;
x = 128;
但这是合法的:
x+= 999l;
我使用eclipse,jdk 7。
谢谢你
byte
有符号并且只能保存 的最大值127
和最小值-128
,这就是为什么第一种情况会给你一个编译错误。
第二种情况会编译,因为您添加到“字节”的值会环绕,请注意999 % 128 = 103
,它在“字节”的有效范围内
在你的第一个:
byte x = 0;
x = 128;
字节是有符号整数类型,8 位宽,可以表示-128
to的范围+127
。
x = 128
表示“分配x
给128
”,默认情况下,128
是 type 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; 有效,因为它是复合赋值运算符。看看这里可能相同或相似的问题。
在第一个语句中x = 128
,由于字节范围0-127
在 java 中,因此需要显式转换,因此会出现编译错误。在第二种情况下,它会溢出并转换为字节范围内的 -25。