Java运营商有趣的问题

时间:2012-05-14 20:53:21

标签: java operators

问题是:

为什么在这种情况下我在Java中遇到编译错误?

byte x = 0;
x = 128;

但这是合法的:

x+= 999l;

我使用eclipse,jdk 7。

谢谢

4 个答案:

答案 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,因此您正在尝试分配intbyte会导致Possible loss of precision错误,因为intbyte宽。要使其正常工作,您必须明确地转换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,这是在字节范围内。