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中时,您会遇到另一个问题:+
运算符导致二进制数字提升。这在以下文件中提到:
当运算符将二进制数字提升应用于一对
操作数,每个操作数必须表示可转换为
数字类型,按顺序应用以下规则:
- 如果其中一个操作数的类型为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);