问题是:
为什么在这种情况下我在Java中遇到编译错误?
byte x = 0;
x = 128;
但这是合法的:
x+= 999l;
我使用eclipse,jdk 7。
谢谢
答案 0 :(得分:4)
byte
已签名且只能保存最大值127
且最小值为-128
,这就是为什么第一种情况会给您一个编译错误。
第二种情况编译是因为你添加到'byte'的值和包围的值,请注意999 % 128 = 103
,它在'byte'的有效范围内
答案 1 :(得分:2)
在你的第一个:
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.
答案 2 :(得分:1)
字节的范围是-128到127.这x + = 999l;因为它是复合赋值运算符而起作用。看看possible same or alike question。
答案 3 :(得分:0)
在第一个语句x = 128
中,由于java中的字节范围是0-127
,因此需要显式转换,因此需要编译错误。在第二种情况下,它溢出并转换为-25,这是在字节范围内。