web-dev-qa-db-fra.com

Un long plus grand que Long.MAX_VALUE

Comment obtenir un numéro long plus long que Long.MAX_VALUE?

Je veux que cette méthode renvoie true:

boolean isBiggerThanMaxLong(long val) {
    return (val > Long.MAX_VALUE);
}
26
gongshw

Cette méthode ne peut pas renvoyer true. C'est le point de Long.MAX_VALUE. Ce serait vraiment déroutant si son nom était ... faux. Ensuite, il devrait être simplement appelé Long.SOME_FAIRLY_LARGE_VALUE et ont littéralement zéro utilisation raisonnable. Utilisez simplement Android isUserAGoat , ou vous pouvez lancer votre propre fonction qui renvoie toujours false.

Notez qu'un long en mémoire prend un nombre fixe d'octets. d'Oracle :

long: le type de données long est un entier complément à deux signé 64 bits. Il a une valeur minimale de -9 223 372 036 854 775 808 et une valeur maximale de 9 223 372 036 854 775 807 (inclus). Utilisez ce type de données lorsque vous avez besoin d'une plage de valeurs plus large que celles fournies par int.

Comme vous le savez peut-être en informatique de base ou en mathématiques discrètes, il y a 2 ^ 64 valeurs possibles pour un long, car il s'agit de 64 bits. Et comme vous le savez grâce aux mathématiques discrètes ou à la théorie des nombres ou au bon sens, s'il n'y a qu'un nombre infini de possibilités, l'une d'entre elles doit être la plus grande. Ce serait Long.MAX_VALUE. Vous demandez donc quelque chose de similaire à "y a-t-il un entier qui est> 0 et <1?" Mathématiquement absurde.

Si vous en avez réellement besoin pour quelque chose de réel, utilisez la classe BigInteger.

56
djechlin

Tu ne peux pas. Si vous avez une méthode appelée isBiggerThanMaxLong(long), elle doit toujours renvoyer false.

Si vous deviez incrémenter les bits de Long.MAX_VALUE, la prochaine valeur doit être Long.MIN_VALUE. Renseignez-vous sur deux compléments et cela devrait vous dire pourquoi.

11
James Cronen

Premièrement, la méthode ci-dessous ne se compile pas car il manque le type de retour et elle devrait être Long.MAX_VALUE au lieu de Long.Max_value.

public static boolean isBiggerThanMaxLong(long value) {
      return value > Long.Max_value;
}

La méthode ci-dessus ne peut jamais renvoyer true car vous comparez une valeur long avec Long.MAX_VALUE, voyez la signature de méthode que vous ne pouvez passer que long là. Tout long peut être aussi grand que le Long.MAX_VALUE, ça ne peut pas être plus grand que ça.

Vous pouvez essayer quelque chose comme ça avec BigInteger class:

public static boolean isBiggerThanMaxLong(BigInteger l){
    return l.compareTo(BigInteger.valueOf(Long.MAX_VALUE))==1?true:false;
}

Le code ci-dessous renverra true:

BigInteger big3 = BigInteger.valueOf(Long.MAX_VALUE).
                  add(BigInteger.valueOf(Long.MAX_VALUE));
System.out.println(isBiggerThanMaxLong(big3)); // prints true
3
NINCOMPOOP

Si triangle.lborderA Est en effet long, alors le test dans le code d'origine est trivialement vrai, et il n'y a aucun moyen de le tester. C'est aussi inutile.

Cependant, si triangle.lborderA Est un double, la comparaison est utile et peut être testée. isBiggerThanMaxLong(1e300) retourne vrai.

  public static boolean isBiggerThanMaxLong(double in){
    return in > Long.MAX_VALUE;
  }
2