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)
,就会发生溢出。
答案 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的值 数字类型,以下规则适用:
如果任何操作数属于引用类型,则将其取消装箱 转换(第5.1.8节)。
- 醇>
应用扩展基元转换(第5.1.2节)来转换或 两个操作数由以下规则指定:
如果任一操作数的类型为double,则另一个操作数转换为double。
否则,如果任一操作数的类型为float,则另一个操作数转换为float。
否则,如果任一操作数的类型为long,则另一个操作数转换为long。
否则,两个操作数都将转换为int类型。
接下来是导致此类二进制数字促销的运算符列表,它包含运算符+
。
所以你看,两个操作数都转换为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
并仅取其最右边的字节。