gpt4 book ai didi

java - Java中的compare()和compareUnsigned()有什么区别

转载 作者:行者123 更新时间:2023-11-30 06:42:17 25 4
gpt4 key购买 nike

我知道compare(int a, int b)如果 a > b 则返回 1 , 0 如果 a == b , -1 a < b .当我面对 compareUnsigned()没有得到它是如何运作的。我已经对 IntelliJ Idea 中关于此方法的文档进行了一些研究,并找出了如何
compareUnsigned()静态方法在接收整数 x 和 y 作为参数后工作:

public static int compareUnsigned(int x, int y) {
return compare(x + -2147483648, y + -2147483648);
}

谁能解释一下与compare(int a, int b) 相比此方法是否有任何特殊功能?方法及其作用。

最佳答案

这可能不是一个完美的答案,因为我不太确定当您调用 Integer.compareUnsigned(-1, 2) 时 Java 到底做了什么,但我会尝试解释我认为正在发生的事情。

首先我想指出的是

Integer.compareUnsigned(-1, 2)

返回 1,表示 -1 大于 2。为什么我会在这里尝试解释。

Integer.compare(int, int)

只是像您手动执行的那样进行正常的整数比较。

在解释 Integer.compareUnsigned(int, int) 之前,让我们先看看有符号和无符号整数是什么。

Java 使用 32 位来存储整数。这意味着 int 变量最多可以表示 2^32 个数字。值的范围将取决于所使用的整数表示。

对于无符号整数,这将是 0 到 4,294,967,295 (2^32 − 1)。这意味着 32 位系统上的最小无符号整数为 0,而 32 位系统上的最大无符号整数为 4,294,967,295。

对于有符号整数,将是 −2,147,483,648 (−2^31) 到 2,147,483,647 (2^31 − 1),表示为二进制补码。

现在您看到 -1 在无符号表示中不存在。在像 C 这样具有无符号类型的语言中。当你做 unsigned int x = -1;在我的基于 Intel 的 64 位 Mac 上(我在这里是特定的,因为与 Java 不同,C 有点特定于实现),-1 被转换为 4294967295,这是无符号整数的最大值。 -2 转换为 4294967294,只比无符号整数的最大值小 1。

#include <stdio.h>

int main() {
unsigned int x = -1;
unsigned int y = -2;

printf("x = %u\ny = %u\n", x, y);
return 0;
}

输出

x = 4294967295 
y = 4294967294

现在您看到负数在 C 中被转换为带符号的等价数。我不太确定这是如何完成的,但您可以查看此答案以更深入地了解它 https://stackoverflow.com/a/7152835/4801462

因此,当您调用 Integer.compareUnsigned(-1, 2) 时,我的猜测是 Java 试图将 -1 视为无符号整数。这意味着 -1 将在比较完成之前转换为非负值。这是如何完成的我不太确定,因为文档没有说明,但你不应该指望它。为什么我这么说?

Java NOT 没有无符号类型,并且 Java 中的 int 能够保持正最大值 2,147,483,647 (2^31 − 1),大约是一半unsigned int 的最大值。因此,即使 -1 被视为无符号整数,它也可能会溢出 int 变量,这将导致在该变量中存储除 -1 的无符号版本之外的其他内容。

我的建议是,除非您 100% 专注于您正在做的事情,否则请避免使用该方法。

注意

更有经验的人可能会有更好的答案。我从来没有用过这种方法。我只是应用我 4 年前从大学学到的知识来回答这个问题。

引用资料:

https://en.wikipedia.org/wiki/32-bit

编辑

当您在 Integer.compareUnsigned(int, int) 中发送 -1 时,Java 可能会做的是获取 -1 的无符号等效项并将其存储在 long 中,因为它可能会溢出 int 然后做比较。

关于java - Java中的compare()和compareUnsigned()有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53718350/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com