当我使用long来保存一个月毫秒时,我发现了一个问题。但我打印负数。所以我做了一个测试
以下代码:
LogUtils.d(TAG, "long max time:"+Long.MAX_VALUE);
LogUtils.d(TAG, "long min time:"+Long.MIN_VALUE);
LogUtils.d(TAG, "a month time:"+1000*60*60*24*30);
LogUtils.d(TAG, "a year time:"+1000*60*60*24*365);
打印:
long max time:9223372036854775807
long min time:-9223372036854775808
a month time:-1702967296
a year time:1471228928
为什么一个月的时间打印:-1702967296
答案 0 :(得分:2)
在表达式1000*60*60*24*30
中,每个术语都是int
,因此每个乘法的结果也将是int
。你在这里得到整数溢出,导致结果为负。即使您已将其转换为long
,它仍然是相同的负数。
您需要改为编写1000L*60*60*24*30
,这会导致每次乘法的结果为long
。也就是说,1000L
是long
,其值为1000,每当您将long
乘以int
时,结果仍为long
。
答案 1 :(得分:0)
简单:前两行导致打印长。
最后两个是 ints 。哪些都在碾过。
默认情况下,整数文字被解释为预期,而不是长。
转到
1000L * 60 *...
相反。这将导致编译器计算整个表达式的时间。