负字符值JAVA

负字符值JAVA,第1张

负字符值JAVA

为什么不给出编译错误或运行时异常?

因为语言规范要求对基本类型的算术是模数

2^width
,所以
-1
成为
2^16-1
char

在关于整数运算的部分中,指出

内置整数运算符不以任何方式指示上溢或下溢。

这样就禁止抛出异常。

对于所使用的postfix-
decrement运算符,具体地说,其行为在15.14.3中指定。

否则,从变量的值中减去值1,并将差值存储回变量中。在减法之前,对值1和变量的值执行二进制数值提升(第5.6.2节)。如有必要,可以通过缩小原始转换(第5.1.3节)来缩小差异,和/或在存储变量之前对变量的类型进行装箱转换(第5.1.7节)。后缀减量表达式的值是存储新值之前的变量的值。

二进制数值提升将值和1都转换为

int
(因为这里的类型是
char
),因此您得到的中间结果
-1
int
,然后执行缩小原始转换:

将有符号整数缩小为整数类型T会简单地丢弃除n个最低阶位以外的所有位,其中n是用于表示类型T的位数。除了可能丢失有关数值幅度的信息外,
,这可能导致结果值的符号与输入值的符号不同。

导致

char
0xFFFF
(由于Java为带符号的整数类型指定了二进制补码表示,在一元减号规范中明确指出):

对于整数值,取反与从零减去相同。 Java编程语言对整数使用二进制补码表示形式
,并且二进制补码值的范围不是对称的,因此,最大负int或long的取反会导致相同的最大负数。在这种情况下会发生溢出,但不会引发异常。对于所有整数x,-x等于(〜x)+1。

对于超出范围的结果的一般环绕行为,例如在乘法运算符的规范中:

如果整数乘法溢出,则结果是数学乘积的低阶位,以某种足够大的二进制补码格式表示。结果,如果发生溢出,则结果的符号可能与两个 *** 作数值的数学积的符号不同。

类似的短语出现在整数加法的规范中,并且需要通过减法来满足

a - b == a + (-b)
,因此将发生溢出行为。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5177102.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-18
下一篇 2022-11-18

发表评论

登录后才能评论

评论列表(0条)

保存