40 votes

Pourquoi Byte.compare () et Integer.compare () sont-ils implémentés différemment?

J'étudie la source de l'OpenJDK.

Les méthodes Byte.compare() et Integer.compare() attiré mon attention:

 public static int Byte.compare(byte x, byte y) {
    return x-y;
}

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

Pourquoi les méthodes Byte.compare() et Integer.compare() ont-elles des implémentations différentes?

50voto

isnot2bad Points 7393

La mise en œuvre de l' Integer.compare ne pas utiliser la soustraction, car cela pourrait provoquer un dépassement de capacité dans le cas où vous êtes en comparant un nombre entier qui est proche, Integer.MIN_VALUE avec un autre qui est proche, Integer.MAX_VALUE.

Ce dépassement ne peut pas se produire dans le cas d' Byte.compare, comme il l'valeurs d'octets sont implicitement converti en nombres entiers, avant d' x-y est calculé.

(voir aussi: Java Language Specification - 5.6.2 Binaire Numérique de Promotion)

8voto

Ingo Points 21438

La méthode Byte peut être implémentée de cette façon, car le résultat de la soustraction est représentable en int . Ce n'est pas le cas dans l'autre cas. Par exemple:

 0 - 0x80000000 == 0x80000000
 

et ceci est négatif, la comparaison indiquerait donc à tort que 0 est inférieur à -2 ^ 31

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X