web-dev-qa-db-fra.com

Java base littérale double hexadécimale

J'étudie pour la certification Java. Et je suis curieux de connaître les littéraux Java. Je sais qu'il est possible de faire quelque chose comme ceci:

int i = 0xAA;
long l = 0xAAL;

Cela est également possible pour les variables à virgule flottante:

double d = 123d;
float f = 123f;

J'ai donc logiquement pensé avec ces exemples que la même chose s'appliquerait à l'hexadécimal. Tout comme je peux ajouter L pour les longs littéraux, je pourrais ajouter "d" ou "f" mais la logique est défectueuse puisque "F" et "D" sont des valeurs hexadécimales valides.

Il n'est pas possible de faire quelque chose comme ça:

double d = 0xAAAAAAAAAAAAAAAAAAd;

Est-ce simplement interdit par Java ou il existe un moyen simple de le faire que je ne connais pas?

39
Bruno Calça

Il s'avère que est possible, même si cela m'a surpris. Section 3.10.2 du JLS donne la structure des littéraux à virgule flottante, y compris HexadecimalFloatingPointLiteral .

public class Test {

    public static void main(String[] args) {
        double d1 = 0xAAAAAAAAAAAAAAAAAAp0d;
        double d2 = 0x1.8p1d;

        System.out.println(d1); // A very big number
        System.out.println(d2); // 24 = 1.5 * 2^1
    }
}

Le p est requis en tant que partie de l'exposant binaire - la valeur après le p est le nombre de bits pour décaler la valeur vers la gauche. Autres exemples:

0x1.4p0d => 1.25 (binary 0.01 shifted 0 bits)
0x8p-4d => 0.5 (binary 1000 shifted *right* 4 bits)
59
Jon Skeet