当前位置: 首页 > 知识库问答 >
问题:

比较长、整数和短方法的不同实现?

田俊爽
2023-03-14

为什么Java库中的静态方法compareforLongIntegerShort的实现不同?

对于

public static int compare(long x, long y) {
    return (x < y) ? -1 : ((x == y) ? 0 : 1);
}

对于整数

public static int compare(int x, int y) {
    return (x < y) ? -1 : ((x == y) ? 0 : 1);
}

对于Short

public static int compare(short x, short y) {
    return x - y;
}

共有3个答案

吴安和
2023-03-14

int的值可以介于[-2147483648、2147483647]之间。如果从2147483647中减去-2147483648,您将得到4294967295。这不能存储在整数中,因此我们使用它来比较两个整数

return (x < y) ? -1 : ((x == y) ? 0 : 1);

long的情况也是如此。

曹旭东
2023-03-14

x-y大概是最有效的(因为替代方案涉及两次分支),所以这用于short

但是x-y不能用于intlong,因为当结果值不适合int时,这将溢出,当结果应该是负值,或者当结果应该为正时为负值(在任何一种情况下都为零)。

注意:当减去两个shorts时,结果值的类型为int,因此永远不会溢出。

// long - long
System.out.println((int)(2147483649l - 1l)); // -2147483648, not 2147483648
// int - int
System.out.println(-2147483648 - 1);         // 2147483647, not -2147483649
// int - int
System.out.println(1 - -2147483648);         // -2147483647, not 2147483649
// short - short
short s1 = -32768, s2 = 1;
System.out.println(s1 - s2);                 // -32769, as desired

值得一提的是:之所以选择上述值,是因为它们大致在int(和short)的最小值和最大值附近,以演示它在哪个点溢出。

林冥夜
2023-03-14

如果你尝试:

System.out.println(Long.MIN_VALUE - Long.MAX_VALUE);

System.out.println(Integer.MIN_VALUE - Integer.MAX_VALUE);

你会得到1,因为溢出(更新:这里应该是下溢,如另一个答案所述),这是不正确的。

然而

System.out.println(Short.MIN_VALUE - Short.MAX_VALUE);

您将获得正确的值-65535,因为将在-操作之前转换为int,从而防止溢出。

 类似资料:
  • 我的代码超时了,因为它效率低下。程序接受一行n个整数。每对连续的整数代表一个点(x,y)。这是一个输入示例: -5 -10 20 25 30 2 -1 -40 输出: 我有代码来排序所有的点。它们从最小到最大排序。如果"x"值相等,则检查y值。问题是:我需要计算一个点比其他点(x和y)大多少倍。所以在上面的例子中,答案是4。 > 第三点比第一点和第二点大。 结果是4。 如果点相等,也增加计数器。

  • 当执行下面的代码段时,它对double的行为不同。 为什么Double的行为与long不同?

  • 我有一个类字段,和。我需要使用对它们进行排序,但我得到了一个异常: java.lang.IllegalArgumentException:比较方法违反了它的一般约定! 我的< code>compareTo方法: 请帮我找出compareTo方法中的错误。谢了。

  • 上述情况导致 上述条件返回。 为什么会这样?这些片段之间有什么区别?

  • 问题内容: 我有以下代码 这是输出 现在我意识到float和int是不同的,但是考虑到四舍五入,我本来希望两个值匹配。我已经通过强制转换为int解决了它。 所以我的问题是,为什么这个比较不能像我期望的那样工作(两个值都匹配)? 问题答案: 请注意PHP手册中的 红色大警告 ! 比较浮点数时不要指望任何东西。即使精度为0,舍入结果仍然是浮点数。在您的特定情况下,碰巧结果要比预期的大一点,因此强制转换

  • 问题内容: 我是Java的新手,我刚刚读了一个整数类的变量,可以用API的三种不同方式来描述。我有以下代码: 这是在循环内,只是输出。 我的目标是弄清楚如何查看整数值。 我知道这是正确的方法吗?还是它? 我知道这是不正确的。这是正确的吗?是否存在值比较运算符? 问题答案: 整数是自动拆箱的,因此您可以执行