tifyty

pure Java, what else ?

Tudáspróba, int, mit ír ki

Mit ír ki az alábbi program?

public class IntDiff {
	public static void main(String[] args) {
		int maxi = Integer.MAX_VALUE;
		int mini = Integer.MIN_VALUE;
		int difi = maxi - mini;
		long difLi = maxi - mini;
		long maxL = Integer.MAX_VALUE;
		long minL = Integer.MIN_VALUE;
		long difLl = maxL - minL;
		System.out.println(difi);
		System.out.println(difLi);
		System.out.println(difLl);
	}
}

Természetesen a copy/paste mindenkinek működik, még a birkapásztoroknak is. Úgy kellene megoldani, hogy csak fejben.

14 responses to “Tudáspróba, int, mit ír ki

  1. bastlaca április 10, 2013 1:10 de.

    Érdekes. A vége nagyon meglepett. Lehet 1-2 projektemet nem ártana átnéznem.
    És ez is ugyan olyan meglepő eredményt adott:
    long a = (int)10;
    long b = (int)-11;
    long difab = a-b;
    System.out.println(difab);

    long c = 10;
    long d = -11;
    long difcd = c-d;
    System.out.println(difcd);
    Mitől van ez? Sajnos nem jöttem rá, de mintha előjel nélküli változóként működne itt a long.

  2. Mefi április 10, 2013 1:16 de.

    difi = -1;

    Azért, mert az Integer.MAX_VALUE értéke n-1, az Integer.MIN_VALUE értéke pedig -n. A pontos értékre nem emlékszem, de ennélfogva egyértelműnek látszik a -1.

    difLi = -1;

    Azt még régebben belénkverték a suliban, hogy byte, short, int, long; vagyis mivel az intben ábrázolható maximum értéke kisebb, mint a longban ábrázolható maximum, ennélfogva ugyanaz érvényes, mint előbb.

    Az előzők alapján a difLl értékére is egyértelműnek tűnik, hogy -1, de úgy emlékszem, hogy itt van valamilyen speciális eset, amiről viszont már gőzöm sincs, de talán egy egynél nagyobb szám lesz az eredmény. (Talán a BigIntegerhez van valami köze?)

    De régen foglalkoztam úgy általában Javával, szóval lehet, hogy totál hülyeség, amit írtam. 😀

  3. btibi április 10, 2013 9:34 de.

    -1
    -1
    4294967295

    Az első kettő esetben az int túlcsordul. A long pedig nem.

  4. Botond április 10, 2013 9:56 de.

    Így elsőre a kiírt programrészletre azt mondanám, hogy az első két esetben túlcsordulás mentén kapnánk értéket:

    – az első esetben ugye pont az adott számábrázolás határait feszegetjük
    – másodjára pedig a kifejezés-kiértékelés során az egyenlőség jobb oldala kiértékelődne első lépésben (túlcsordulásostul) majd ezt követően a kapott érték konvertálódik long-gá

    A harmadik esetben mivel végig szélesebb értelmezési tartományban mozgunk, nagy problémára számítani nem kell.

    Most pedig lássuk, milyen értéket is kaphatunk. A kettes komplemens ábrázolás szerint a negatív minimum képe

    100..00 (int esetén 1-es, majd 31 db 0)

    a maximumé pedig

    011..11 (int esetén 0, majd 31 db 1-es)

    Ezt összeadva 111..11 (32 db 1-es) kapunk, ami ismételten a kettes komplemens képzési szabályait figyelembe véve épp -1.

  5. Mark április 10, 2013 10:07 de.

    Nem spoilerezek, de segítségképpen annyi, hogy az 5. és 6. sorban inteken történik _csak_ művelet, míg a 9-edikben _csak_ longokon. Innen már lesz spoiler, ne olvass tovább! 🙂

    Szóval egy barátom hotspot internals olvasgatása közben hívta fel a figyelmem valamire, amivel most továbbhekkelhetem a feladatodat. Ha az inteken való kivonás művelet eredményét egy szélesebb típusban tárolom, akkor továbbra is -1 lesz az eredmény. Ebből következik az, hogy ha a shortokon végzett kivonás műveletét szélesebb típusban tárolom, akkor az is -1 lesz?

    public class IntDiff {
        public static void main(String[] args) {
            int maxi = Integer.MAX_VALUE;
            int mini = Integer.MIN_VALUE;
            long difi = maxi - mini;
            System.out.println(difi);
    
            short maxs = Short.MAX_VALUE;
            short mins = Short.MIN_VALUE;
            int difs = maxs - mins;
            System.out.println(difs);
        }
    }
    

    A válaszért vagy olvassuk el a jvm-specifikációt,vagy legyen olyan barátunk, aki elolvassa nekünk. De álljon itt a teljesség kedvéért: a jvm-ben nincs short-on, byte-on, booleanon dolgozó művelet, a stacken _csak_ intekkel dolgozik ilyen esetekben. az int-be viszont belefér a Short.MAX- és MIN_VALUE különbsége, így a fenti program kimenete: -1 és 655335.
    Hasonló implementációs részletek miatt a short difs = maxs – mins; le sem fordul.

    Itt található a jvm instruction set summary, láthatóan ahol egész jellegű típusokkal dolgozik, ott bizony csak i-vel, l-lel kezdődő utasítások vannak. (Igen, még booleannál is).
    http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.11.3

  6. Pipogya április 15, 2013 1:00 de.

    De hisz már az egyik előző posztba is volt, hogy a lead birkapásztorok import-állnak, nem copy-paste manufaktúrálnak.

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s

%d blogger ezt kedveli: