Long、Integer 和 Short 比较方法的不同实现?
Different implementations of compare method for Long, Integer and Short?
为什么Java的库中Long
、Integer
和Short
的静态方法compare
的实现不同?
对于Long
:
public static int compare(long x, long y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
对于Integer
:
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;
}
如果你尝试:
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
,因为 short
会在 -
操作之前转换为 int
,从而防止溢出。
x - y
大概是最有效的(因为备选方案涉及两次分支),因此用于 short
.
但是 x - y
不能用于 int
或 long
,因为当结果值不适合 [=14] 时,这将 overflow =],它可以在结果应该为负时给出正值,或者在结果应该为正时给出负值(在任何一种情况下都为零)。
注意:减去两个short
时,the resulting value is of type 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
)的最小值和最大值附近,以演示溢出的点。
int 可以具有 [-2147483648, +2147483647]
之间的值。如果从 +2147483647
中减去 -2147483648
,您将得到 4294967295
。这不能存储在 int 中,因此我们用它来比较 2 个 int
return (x < y) ? -1 : ((x == y) ? 0 : 1);
long也是如此
为什么Java的库中Long
、Integer
和Short
的静态方法compare
的实现不同?
对于Long
:
public static int compare(long x, long y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
对于Integer
:
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;
}
如果你尝试:
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
,因为 short
会在 -
操作之前转换为 int
,从而防止溢出。
x - y
大概是最有效的(因为备选方案涉及两次分支),因此用于 short
.
但是 x - y
不能用于 int
或 long
,因为当结果值不适合 [=14] 时,这将 overflow =],它可以在结果应该为负时给出正值,或者在结果应该为正时给出负值(在任何一种情况下都为零)。
注意:减去两个short
时,the resulting value is of type 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
)的最小值和最大值附近,以演示溢出的点。
int 可以具有 [-2147483648, +2147483647]
之间的值。如果从 +2147483647
中减去 -2147483648
,您将得到 4294967295
。这不能存储在 int 中,因此我们用它来比较 2 个 int
return (x < y) ? -1 : ((x == y) ? 0 : 1);
long也是如此