package p03_zmienne_i_typy;

public class LiteralyLiczbowe {

    public static void main(String[] args) {
        int x;

        x = 123; // format dziesiętny
        System.out.println(x);

        x = 0123; // system ósemkowy
        //NK x = 08;  // cyfry od 0 do 7
        System.out.println(x);

        x = 0x100; // system szesnastkowy
        System.out.println(x);
        x = 0x7F;
        System.out.println(x);

        // system dwójkowy - od Javy 7
        x = 0b1101;
        System.out.println(x);

        // odstępy pomiędzy cyframi - od Javy 7
        x = 2_000_000;
        System.out.println(x);

        //NK long l = 4000000000; // wartość nie mieszcząca się w int
        long l = 4000000000L; // OK

        // int _1000 = 1313;

        // x = _1000;  // odwołanie do zmiennej :)
        // x = 1000_;
        x = 10______00; // po prostu tysiąc

        // dopuszczalne są tylko pomiędzy cyframi.
        // nie na początku, nie na końcu, nie obok kropki ani obok litery typu i wykładnika

        x = 0x0F_FF_80_00;
        x = 0b0011_0101;

        System.out.println(x); // 1000

        double dd = 10__00;
        dd = 3.14; // literał liczbowy z częścią ułamkową jest typu double (a nie float)
        dd = 1_00.0__0;
        //dd = 100._9;
        //dd = 100_.9;

        dd = 100.99d;
        //dd = 100.99_f;

        // x = 0x_FF;

        // NK x = 1L; // L na końcu oznacza typ long (może być duże lub małe)

        l = 1L;
        l = 1; // inta można wpisać na zmienną long

        System.out.println();

        float f = 12; // int na float - OK
        // f = 3.14;
        // literał z ułamkiem jest typu double, a double nie można wpisać na float
        f = 3.14F;
        f = 1.0f;
        f = 3f;
        f = 1.13e2F;
        f = (float)3.14; // kompiluje się, ale niezalecane, bo można zgubić precyzję
        System.out.println(f);

        double d = 3.14;
        // NK f = d;
        // na końcu double'a też można podać info o typie: D  albo d
        d = 4.44d;
        d = 4.445D;

        // liczba w notacji dziesiętnej razy 10 do podanej potęgi
        d = 1.25e3;
        System.out.println(d);
        d = 4.44e-3;
        System.out.println(d);
        System.out.println();

        // liczba w notacji szestastkowej razy 2 do podanej potęgi - tak to jest przechowywane wewnętrznie!
        d = 0x3p2; // 12
        System.out.println(d);
        d = 0x0.2p0; // 2/16 = 1/8 = 0.125 
        System.out.println(d);
        d = 0x1p-3;
        System.out.println(d);
    }
}
