为什么字节的最大值加一,但没有溢出

时间:2015-09-29 18:39:51

标签: java byte overflow

class Overflowtest {

  public static void main(String[] args) {

    byte maxValue= Byte.MAX_VALUE;
    System.out.println("maxValue of byte is "+maxValue);
    System.out.println("add 1 to maxValue of byte is "+maxValue+(byte)2);

  }
}

为什么尝试maxValue+(byte)2时没有发生溢出? 但如果我这样做,(byte)(maxValue+2),就会发生溢出。

3 个答案:

答案 0 :(得分:5)

在您的示例中,您将127添加到字符串,然后将2添加到字符串。

但是当你这样做时:

?max_id=XXXXXXXXXX&q=%23hashtag&count=100&include_entities=1&result_type=recent

二进制运算返回一个整数。

答案 1 :(得分:2)

正如其他人在解决您的括号后所述,您可以打印值

System.out.println("add 1 to maxValue of byte is "
                + (maxValue + ((byte) 2)));

这给你输出129。

原因在于,Integer addition发生了什么。不是字节赋值。所以你没有看到任何例外。

当您将字节转换值添加到maxValue时立即转为整数加法。

要检查您的实际问题,请尝试

byte maxValue2 =(maxValue + ((byte) 2));

由于结果是int,因此无法编译。因此,当您将代码更改为

int  maxValue2 = maxValue + ((byte) 2);

有效。

当你在将结果转换为byte

的帮助下进行字节赋值时,现在又来了解你的旧解释
byte maxValue2 = (byte) (maxValue + ((byte) 2));

现在您可以静默地看到溢出并截断整数的高阶位,并将maxValue2结果导致-127

答案 2 :(得分:2)

第一个问题是你首先将127连接到字符串,然后连接2.所以你看到的值实际上是“1272”。

但是当您将(maxValue + (byte)2)放入paretheses时,还有另一个问题:+运算符导致二进制数字促销。这在Java Language Specification, item 5.6.2

中提到
  

当运算符将二进制数字提升应用于一对时   操作数,每个操作数必须表示可转换为a的值   数字类型,以下规则适用:

     
      
  1. 如果任何操作数属于引用类型,则将其取消装箱   转换(第5.1.8节)。

  2.   
  3. 应用扩展基元转换(第5.1.2节)来转换或   两个操作数由以下规则指定:

         
        
    • 如果任一操作数的类型为double,则另一个操作数转换为double。

    •   
    • 否则,如果任一操作数的类型为float,则另一个操作数转换为float。

    •   
    • 否则,如果任一操作数的类型为long,则另一个操作数转换为long。

    •   
    • 否则,两个操作数都将转换为int类型。

    •   
  4.   

接下来是导致此类二进制数字促销的运算符列表,它包含运算符+

所以你看,两个操作数都转换为int。只变为127 + 2,不会溢出int范围。结果是int

要查看实际的溢出,您可能需要执行以下操作:

byte newValue = (byte) (maxValue + (byte)2); // Notice that you can't assign it without the cast!
System.out.println(newValue);

这个溢出实际上并不是因为添加2而导致的,而是截断整数129并仅取其最右边的字节。