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

Java 为什么字节的最大值加1,但没有溢出,java,byte,overflow,Java,Byte,Overflow,为什么在尝试maxValue+(byte)2时没有发生溢出? 但如果我这样做,(byte)(maxValue+2),就会发生溢出 在您的示例中,将127添加到字符串中,然后将2添加到字符串中 但当你这样做的时候: class Overflowtest { public static void main(String[] args) { byte maxValue= Byte.MAX_VALUE; System.out.println("maxValue of byte i

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

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

但当你这样做的时候:

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);

  }
}

二进制操作返回一个整数。

正如其他人所说,解析括号后,您可以打印该值

System.out.println(maxValue+(byte)2);
这将为您提供输出129

原因是这里发生的是
整数加法
。不是字节分配。所以你没有看到任何例外

当您将字节强制转换的值添加到
maxValue
时,该值立即变为整数加法

要检查您的实际问题,请尝试执行以下操作

System.out.println("add 1 to maxValue of byte is "
                + (maxValue + ((byte) 2)));
这不会编译,因为结果是一个int

byte maxValue2 =(maxValue + ((byte) 2));
这很有效

现在再次回到旧的解释,当您在将结果转换为字节的帮助下进行字节赋值时

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

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

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

但是,当您将
(maxValue+(byte)2)
放在paretses中时,您会遇到另一个问题:
+
运算符导致二进制数字提升。这在以下文件中提到:

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

  • 如果任何操作数属于引用类型,则将对其进行取消装箱 转换(§5.1.8)

  • 加宽原语转换(§5.1.2)用于转换或 由以下规则指定的两个操作数:

    • 如果其中一个操作数的类型为double,则另一个操作数将转换为double

    • 否则,如果其中一个操作数的类型为float,则另一个操作数将转换为float

    • 否则,如果其中一个操作数的类型为long,则另一个操作数将转换为long

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

  • 后面是导致这种二进制数字提升的运算符列表,其中包括运算符
    +

    可见,两个操作数都转换为
    int
    。并变成刚好
    127+2
    ,这不会溢出
    int
    范围。结果是一个
    int

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

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

    这个溢出实际上并不是由于加2而产生的,而是由于截断整数
    129
    并只取其最右边的字节而产生的。

    您只是添加了一些值。但是没有分配给任何
    字节
    类型。您在标题中写+并在代码中做+2:)@Doris
    但示例是System.out.println(“将2添加到int的maxValue是”+(maxValue+2));并且输出是溢出的
    ,这意味着作者错了。
    byte newValue = (byte) (maxValue + (byte)2); // Notice that you can't assign it without the cast!
    System.out.println(newValue);