A simple Java puzzler
1
2
| final long YEAR_IN_MS = 1000 * 60 * 60 * 24 * 365; System.out.println(YEAR_IN_MS); |
What will be printed?
06-'09 Installing DB2 Express C on linux
06-'09 Undecipherable product descriptions
Comments


[Comment edited on Thursday 18 June 2009 15:10]
final long YEAR_IN_MS = 1000 * 60 * 60 * 24 * 365L;
System.out.println(YEAR_IN_MS);
Levert wel 31536000000 op...
[Comment edited on Thursday 18 June 2009 15:12]
Klopt. Alle berekeningen in Java worden standaard op 32 bits gedaan, als de argumenten in een int passen. Als één van de argumenten een long is, wordt er een berekening op 64 bits gedaan. Een 'l' achter één van de argumenten plakken zou al genoeg geweest zijn.
@Rctworld
Dat soort quirks zou je eigenlijk wel moeten kennen, dit is één van de bekendste 'bugs' van Java.
[Comment edited on Thursday 18 June 2009 15:18]
1471228928
Al hoewel
31536000000
dichter in de buurt van de werkelijkheid komt.
Heb ik nu een ijsje verdient?
[Comment edited on Thursday 18 June 2009 15:17]
1471228928
??? waar dat vandaan komt snap ik toch niet goed...
(klasse bevat _geen_ andere code dan de 2 regels hierboven, op de noodzakelijke 'public static void main'-regel & bijhorende haakjes na...
Edit:
@mezelf:
in het vervolg geen kwartier bezig zijn met testen terwijl ge aan het reageren zijt...
Of toch op zijn minst ne refresh doen vooraleer ik mijn reactie effectief plaats :-)
@Confusion:
Toen ik begon te reageren stonden er nog maar 2 commentaren... en met de ondertussen bijgevoegde te lezen snapte ik ook dat het over een overflow ging...
[Comment edited on Thursday 18 June 2009 15:42]
De belangrijkste les die ik hier van geleerd heb is: zoek ook waar het onmogelijk kan liggen. Daardoor vond ik de bug vandaag in 5 minuten, in tegenstelling tot de eerste keer dat ik tegen zoiets aanliep. Niettemin las ik er nog steeds overheen en moest ik YEAR_IN_MS echt printen voordat ik zag dat dat natuurlijk niet kon.
@roeleboel:
de uitkomst van de berekening is een int, die pas na de berekening naar een long wordt geconverteerd. Dan is het kwaad al geschied.
[Comment edited on Thursday 18 June 2009 15:36]
[Comment edited on Thursday 18 June 2009 16:17]
Java:
1
| final long yearInMs = Period.years(1).getMillis(); |


code:
1
| int hourInSeconds = Period.hours(1).getSeconds(); |
(Note: I have no idea if your Period class as an hours() function, nor if its result has a getSeconds().) Or even:
code:
1
| int minuteInSeconds = Period.minutes(1).getSeconds(); |
Personally, I would write this:
code:
1
| final long YEAR_IN_MS = 31536000000; /*1000 * 60 * 60 * 24 * 365*/ |
Its the fastest solution, and in my opinion its just as readable as what Confusion used more readable then using that joda-time framework. (Especially for people who don't know the joda-time framework, like me.)
1471228928
Dat is de uitkomst die Java geeft.
En Java is oh zo geweldig

Dat zegt Visual Studio


@GrooV: VS.NET FTW =)
@Jaap-Jan: Niet ALLE berekeningen. Een getal gewoon (zonder komma, passent in een int) wordt geinterpreteerd als een int.
[Comment edited on Thursday 18 June 2009 22:52]
Comments are closed