JavaVM issue - Bug or feature?

Red*Star

Mitglied
Hallo!

Kann das hier irgendjemand reproduzieren?

Java:
			int paircount2 = 49000;
			int paircount3 = 49000;
			long paircount4 = paircount2 * (paircount3 - 1) / 2;
			int paircount5 = paircount2 * (paircount3 - 1) / 2;
			int paircount6 = 49000 * (49000 - 1) / 2;
			
			System.out.println(paircount2);
			System.out.println(paircount3);
			System.out.println(paircount4);
			System.out.println(paircount5);
			System.out.println(paircount6);

Die Ausgabe ist bei mir

49000
49000
-947008148
-947008148
-947008148

aber die letzten 3 Zeilen sollten ja irgendwie positiv sein. Oder hab ich hier irgendeine seltsame implizite Konversionsregel übersehen?

Der Code, den ich *eigentlich* benutzen möchte, lautet

Java:
			long paircount = database.getDataCount() * (database.getDataCount() - 1) / 2;

und dabei hab ich das gleiche Problem. (Genau genommen bin ich von da aus zu diesem seltsamen "Bug" [?] gekommen... normalerweise wird es ja "besser", wenn man statt Funktionsaufrufen Konstanten einsetzt. Hier nicht.)


Ich hab die JavaVM in der Version 1.6.0_11, OS ist Windows XP SP3.


Grüße,

Red*Star
 

Nicer

Bekanntes Mitglied
Genau , und um das ganze zu umgehen musst du entweder die int klasse überladen und sie größer machen ( falls das noch geht ) oder kleinere zahlen nehmen ;)
 

Red*Star

Mitglied
Mhm also Zeile 3 müßte dann eher
Java:
long paircount4 = paircount2 * (paircount3 - 1L) / 2;
z.B. heißen, dann gibst auch ein positives Ergebnis.

Bei dem Rest.. die Multiplikation (2400951000) sprengt ja schon Integer.MAX_VALUE (2147483647) ==> (-1894016296) Dividiert durch 2 = -947008148 ???:L

Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 2.3 Datentypen, Typisierung, Variablen und Zuweisungen

Oh f**k... man ist das *peinlich*. Ich hab die Sache dreimal nachgerechnet... Hab aber jedes Mal am Anfang eine Null verloren. Sprich ich hab in meiner Rechnung die Typgrenzen gar net gesprengt. *grummel*

Danke!
 

Ähnliche Java Themen


Oben