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

为什么Integer.MIN_VALUE的负数给出相同的值?

逄念
2023-03-14
问题内容

考虑下面的java代码。

Integer value = Integer.MIN_VALUE;
System.out.println(value);

value = -value;
System.out.println(value);

输出量

-2147483648
-2147483648

价值的负值如何产生Integer.MIN_VALUE相同的价值?

但是结果不能是2147483648因为java中Integer的最大值是2147483647

但是想知道为什么-2147483648吗?内部正在发生哪种按位运算?


问题答案:

内部正在发生哪种按位运算?

Java使用带符号数字的二进制补码表示。因此,更改符号操作包括两个步骤:

  1. 反转原始值的位,并
  2. 添加1到结果中。

2147483648的表示如下:

10000000000000000000000000000000

反转产生

01111111111111111111111111111111

加法1使其再次成为相同的数字,即

10000000000000000000000000000000

由于整数溢出。



 类似资料:
  • 问题内容: 在Java中,当我说。我得到与答案相同的值,即包含。我已经在C ++中验证了同样的内容。 为什么会这样呢? 问题答案: 阅读Joshua Bloch撰写的Effective Java中的内容。 我找到了这个问题的答案,这里是解释:计算机使用二进制算术工作,java或任何语言的函数的逻辑如下: 注意:如何找到2的补码 对于给定的数字,我们首先找到它的补数,然后再加1。例如,假设我们的数字

  • 我需要从30fps的视频中提取帧两次:(I)720p png帧,(ii)270p tiff帧。 我分别使用以下命令来实现这一点: 然而,这导致第一命令输出35,776帧,第二命令输出35,812帧,尽管视频是相同的,并且所请求的framerate是30fps。 这是什么原因造成的?如何确保ffmpeg输出相同数量的(同步)帧?

  • 问题内容: 是真的。 我知道Java中的整数是32位,并且不能超过2 31 -1,但是我不明白为什么要在其结果中加1 而不是某种例外。更不用说像Ruby这样的透明转换为更大的类型了。 是否在某处指定了此行为?我可以依靠吗? 问题答案: 因为整数溢出。溢出时,下一个值为。相关JLS 如果整数加法溢出,则结果是数学和的低阶位,以某种足够大的二进制补码格式表示。如果发生溢出,则结果的符号与两个操作数值的

  • 问题内容: 查看以下代码,并请解释为什么该方法和函数给出两个不同的输出。 输出: 问题答案: 计算子字符串的非重叠出现次数: 返回substring sub 的不重叠出现的次数。 在字符串中恰好有一个这样的子字符串出现的位置:就在开头。因此计数 应该 返回。 一般来说,空字符串将匹配给定字符串中的 所有位置 ,包括开始和结束处的正确 位置 ,因此计数应 始终 为长度加1: 这是因为空字符串被认为存

  • 我正在努力学习同步。根据我所了解的,下面的代码应该给出8000作为最终结果,但是我得到了一个随机的结果,如下所示; 还是得到1293 2214 1403 3214 4214 5214 6224 7037这样的输出有没有人能给我解释一下如何实现同步,这里出了什么问题?