- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在 Java 中,当我说 Integer i = Math.abs(Integer.MIN_VALUE)
时。我得到与答案相同的值,这意味着 i
包含 Integer.MIN_VALUE
。我也在 C++ 中验证了相同的内容。
为什么会这样?
最佳答案
阅读 Joshua Bloch 的 Effective Java。
我找到了这个问题的答案,这里是解释:计算机使用二进制运算,Java 中的Math.abs
或任何语言中的absolute
函数的逻辑如下:
if(num >= 0)
return num;
else
return (2's complement of the num);
注意:如何求2的补数
对于一个给定的数,我们先求它的补码,然后再对它加 1。例如假设我们的号码是 10101
1 的补码 = 01010
2 的补码 = 01011
(1 的补码加 1)
现在,为了简单明了,假设我们的整数(有符号)大小为 3 位,那么这里是可以使用这 4 位生成的可能的数字列表:
000 --> 0 (0)
001 --> 1 (1)
010 --> 2 (2)
011 --> 3 (3)
100 --> 4 (-4)
101 --> 5 (-3)
110 --> 6 (-2)
111 --> 7 (-1)
既然这是有符号的,这意味着一半的数字是负数,另一半是正数(负数是第一个位为 1 的数字)。让我们从 000
开始,并尝试找到它的负数,它将是 000
的二进制补码。
2's complement of `000` = 1 + `111` = `000`
2's complement of `001` = 1 + `110` = `111`
2's complement of `010` = 1 + `101` = `110`
2's complement of `011` = 1 + `100` = `101`
2's complement of `100` = 1 + `011` = `100`
2's complement of `101` = 1 + `010` = `011`
2's complement of `110` = 1 + `001` = `010`
2's complement of `111` = 1 + `000` = `001`
从上面的演示,我们发现111(-1)的2的补码是001(1)
,同理110(-2)的2的补码是010(2)
,101(-3) 的 2 的补码是 011(3)
而 100(-4) 的 2 的补码是 100(-4)
我们可以看到 -4 是可能使用 3 位的最小负数。
这就是为什么 Integer.MIN_VALUE
的绝对值是 Integer.MIN_VALUE
的原因。
关于java - 为什么 Integer.MIN_VALUE 的绝对值等于 Integer.MIN_VALUE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18565485/
我正在尝试解决一个问题: 编写一个程序计算非负整数之间的差值。 输入: 输入的每一行都由一对整数组成。每个整数都在 0 到 10 之间提高到 15(含)。输入在文件末尾终止。 输出: 对于输入中的每一
我有一个这样的数据框: Current Dataframe: ID Price Price_List 0 Prodt1 1500 [-5.2, -4.6, -3.3,
很难解释...让我试试: 我构建了一个脚本来比较两个用户的兴趣(爱好) 假设用户 A 有 44 种爱好,并且与用户 B(有 19 种爱好)有 13 种共同爱好所以在伪代码中(其中 % 是我的公式):
我在 LINQ 查询中使用 EntityFunctions 类: var a = dbContext.Where(x=>EntityFunctions.DiffMinutes(dateA,dateB)
我正在做一项作业,我应该返回 3 个值中最小的一个(绝对值,如程序所述)。当只需要返回 2 个值时,它工作得很好,但是当我添加第三个值时,它开始在方法内的 Math.min 处显示“找不到符号”。 :
我写了一个名为 absD 的函数,我想返回它的参数的绝对值..我在 cygwin 中使用 GCC 内联汇编.. 我不明白为什么它不起作用。我正在加载到内存中。然后进入 st(0)我在哪里使用 fabs
以原始形式。 svm 中很少有 alpha 值为正,相应的 x 将是支持向量,如图所示 http://en.wikipedia.org/wiki/Support_vector_machine . 如果
我对 xcode 中 ABS(A) 和 abs(int) 这两者的区别感到困惑。似乎也无法在网上找到任何解释。我应该使用哪个?我实际上正在研究加速度计。使用 ABS(A) 和 abs(int) 给了我
我一直在努力尝试理解 pandas 时间戳和时间增量。我喜欢你使用它们的方式,但在尝试减法时我发现这有点奇怪: now = pd.Timestamp('now') then = now - pd.to
假设我有一个对称矩阵 M,它不是正(半)定的,我想计算它的 k 顶(绝对值)特征值(和相应的特征向量)。现在,可以使用截断的 SVD 来做到这一点,它将返回所述特征值的绝对值,然后必须检查符号并找到相
问题很简单。我需要一行命令,例如, Math.round((-Math.random() * 2)) , 输出 只是显示 1 和 -1 .我试图弄清楚,但这似乎不是一件容易的事!我可以使用 IF 命令
我有一个看起来像这样的表: Country | Item | Col1 | Col2 | Col3 | Col4 4 | 4 | .152 | .01 | .65 | 1
我是 Laravel 框架的新手,我正在寻找如何编写查询以获得绝对值(简而言之,忽略 + 和 - 符号,只显示数据库中的数字。我知道我们可以使用 Abs 来获得它。但我不知道该怎么做。看看我的代码:
Working jsfiddle 对 jQuery/javacript 来说还是个新手,但我有 2 个函数,它们在检查时对隐藏值求和,并且我需要生成它们差异的绝对值: $(document).read
我有这个数据框和代码。 from pandas import DataFrame import pandas as pd import numpy as np df = pd.DataFrame({'
我知道 - 过早的优化。 但是我有代码可以查明某个位置是否发生了变化,而不是缓存的位置。 当前代码是: if(abs(newpos-oldpos) > 1){ ..... } 使用下面的是不是
This question它的答案描述了为什么 i32 上的 abs() 返回 i32 而不是 u32。它说“似乎公认的解决方法是使用 as u32 进行转换”。但是,如果参数是 std::i32::
我是一名优秀的程序员,十分优秀!