【问题标题】:Java operators interesting issueJava 运算符有趣的问题
【发布时间】:2012-05-14 20:53:20
【问题描述】:

问题是:

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

byte x = 0;
x = 128;

但这是合法的:

x+= 999l;

我使用eclipse,jdk 7。

谢谢

【问题讨论】:

  • 你到底想问什么,除了有一个变量 x 之外,各个代码块没有任何共同点?
  • 他的意思是x在第二种情况下也是字节

标签: java operators


【解决方案1】:

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

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

【讨论】:

  • 加什么数无所谓,加法永远不会编译失败;它只会溢出——而不是试图分配一个超出范围的编译时常量。
  • 这很有趣,但为什么呢?在编译器中可以看到它溢出并且可以禁止它但它没有这样做..
  • @SergeyKucher 也提到了 Marko,溢出只会在加法时发生。分配不是加法。
【解决方案2】:

在你的第一个:

byte x = 0;
x = 128;

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

x = 128 表示“将x 分配给128”,默认情况下,128 的类型为int,因此您尝试将int 分配给byte,这会导致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.

【讨论】:

    【解决方案3】:

    byte 的范围是 -128 到 127。 this x+= 999l;有效,因为它是复合赋值运算符。看看这里possible same or alike question

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-20
        • 2015-01-16
        • 2011-04-15
        • 1970-01-01
        • 2015-03-19
        • 2011-08-13
        • 2011-04-17
        相关资源
        最近更新 更多