当前位置: 首页 > 面试题库 >

负字符值JAVA

云啸
2023-03-14
问题内容

为什么会发生以下情况:

char p = 0;
p--;
System.out.println(p);

结果 65535

为什么不给出编译错误或运行时异常?我期待它,因为字符不能为负。相反,它从上向下开始倒计数。提前致谢。


问题答案:

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

因为语言规范要求对基本类型的算术是模数2^width,所以-1成为2^16-1char

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

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

这样就禁止抛出异常。

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

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

二进制数值提升将值和1都转换为int(因为这里的类型是char),因此您得到的中间结果-1int,然后执行缩小原始转换:

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

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

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

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

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

类似的短语出现在整数加法的规范中,并且需要通过减法来满足a - b == a + (-b),因此将发生溢出行为。



 类似资料:
  • 本文向大家介绍php字符串操作针对负值的判断分析,包括了php字符串操作针对负值的判断分析的使用技巧和注意事项,需要的朋友参考一下 本文实例分析了php字符串操作针对负值的判断方法。分享给大家供大家参考,具体如下: 运行结果输出如下: 1 int -1 boolean true 总结: 字符串 '-1'的逻辑值是true; 更多关于PHP相关内容感兴趣的读者可查看本站专题:《php字符串(stri

  • 我必须制作一个程序,允许用户输入整数,直到按下“0”。程序必须打印:1)输入数字的总数2)正数3)正数的平均数4)负数5)负数的总和 到目前为止,我所能做的就是“输入直到按下‘0’”,并找到输入的数字的数量,这对我和我的编程技能来说是非常重要的。我很难找出这个数字是正数还是负数。也许我没有正确地比较他们,所以如果我能得到一些高级人员的帮助,我会很高兴。 这是我到目前为止的代码:

  • 输出为 40 -128 第一个输出是40,我理解,但第二个输出是128,怎么可能?是否可能是因为它超出了其范围?如果是,它在字节转换后是如何工作的。。。帮助我

  • 问题 你想创建一个字符串,让它包含体现某个 CoffeeScript 变量的文本。 解决方案 使用 CoffeeScript 中类似 Ruby 的字符串插值,而不是 JavaScript 的字符串拼接。 插值: muppet = "Beeker" favorite = "My favorite muppet is #{muppet}!" # => "My favorite muppet is B

  • 符号可以被视为运算符或负号。如果位于开始,则应将其视为负号和抹去字符串的减法。这仅适用于符号,而将始终是加号。如何实现此目的? 输入: 输出: 到目前为止我一直在尝试

  • 问题内容: 我通过执行以下功能将传入的字符串转换为哈希码,但其中一些值为负数。我不认为哈希值应该为负。请告诉我我在做什么错。 问题答案: 我不认为哈希值应该为负。 为什么不?具有负哈希码是完全有效的。提出哈希码的大多数方法自然都以负值结尾,处理它们的任何事情都应考虑到这一点。但是,我会考虑采用另一种方法来计算您的哈希码,例如 目前尚不清楚这些表达式的类型是什么,但是我猜想您最终将要使用字符串的哈希