为什么会发生以下情况:
char p = 0;
p--;
System.out.println(p);
结果 65535
为什么没有出现编译错误或运行时异常? 我本来以为字符不能是负数。相反它从倒数开始倒数。 提前感谢。
2^width
,所以-1
在char
中变成了2^16-1
。在整数操作部分中指出:
所以禁止抛出异常。对于特定使用的后缀递减运算符,其行为在15.14.3中有明确规定。内置整数运算符不以任何方式指示溢出或下溢。
这段代码会导致char
值为0xFFFF
(由于Java对于其带符号整数类型采用二进制补码表示法,该规范在取反运算符中有明确说明):
对于整数值,取反等同于从零开始减去该值。 Java编程语言使用二进制补码表示整数,而二进制补码值的范围不对称,因此对最大负整数或长整型数进行取反将导致相同的最大负数。在这种情况下会发生溢出,但不会抛出异常。对于所有整数值x,-x等于(~x)+1。
对于超出范围结果的一般环绕行为,以乘法运算符的规范为例:
如果整数乘法溢出,则结果是以某个足够大的二进制补码格式表示的数学乘积的低位比特。因此,如果发生溢出,则结果的符号可能与两个操作数值的数学乘积的符号不同。a - b == a + (-b)
,因此溢出行为遵循。