我有一个需要转换为整数的long值.当我使用强制转换时,时间整数值给出一个负值,这是不期望的.但是当我使用该intValue()方法时Long,会出现预期的结果.
我想知道cast和using intValue()方法的区别
铸造实例
int days = (int) ((toDate.getTime() - fromDate.getTime()) / (1000 * 60 * 60 * 24));
intValue示例
int days = ((Long) ((toDate.getTime() - fromDate.getTime()) / (1000 * 60 * 60 * 24))).intValue();
编辑:更详细说明示例以显示减值而不会出现溢出,如评论中所示.在转换之前,结果是27.当转换时,值变为-22.但是如果使用intValue方法,结果是27.
码
System.out.println("nextDeliveryDate = " + nextDeliveryDate);
System.out.println("nextDeliveryDate.getTime() = " + nextDeliveryDate.getTime());
System.out.println("expectedDeliveryDate = " + expectedDeliveryDate);
System.out.println("expectedDeliveryDate.getTime() = " + expectedDeliveryDate.getTime());
System.out.println("nextDeliveryDate.getTime() - expectedDeliveryDate.getTime() = " + (nextDeliveryDate.getTime() - expectedDeliveryDate.getTime()));
System.out.println("(nextDeliveryDate.getTime() - expectedDeliveryDate.getTime()) / (1000 * 60 * 60 * 24) = " + (nextDeliveryDate.getTime() - expectedDeliveryDate.getTime()) / (1000 * 60 * 60 * 24));
System.out.println("((int) (nextDeliveryDate.getTime() - expectedDeliveryDate.getTime()) / (1000 * 60 * 60 * 24)) = " + ((int) (nextDeliveryDate.getTime() - expectedDeliveryDate.getTime()) / (1000 * 60 * 60 * 24)));
System.out.println("((Long) ((nextDeliveryDate.getTime() - expectedDeliveryDate.getTime()) / (1000 * 60 * 60 * 24))).intValue() = " + ((Long) ((nextDeliveryDate.getTime() - expectedDeliveryDate.getTime()) / (1000 * 60 * 60 * 24))).intValue());
Run Code Online (Sandbox Code Playgroud)
结果
Info: nextDeliveryDate = Thu May 14 00:00:00 IST 2015
Info: nextDeliveryDate.getTime() = 1431541800000
Info: expectedDeliveryDate = Fri Apr 17 00:00:00 IST 2015
Info: expectedDeliveryDate.getTime() = 1429209000000
Info: nextDeliveryDate.getTime() - expectedDeliveryDate.getTime() = 2332800000
Info: (nextDeliveryDate.getTime() - expectedDeliveryDate.getTime()) / (1000 * 60 * 60 * 24) = 27
Info: ((int) (nextDeliveryDate.getTime() - expectedDeliveryDate.getTime()) / (1000 * 60 * 60 * 24)) = -22
Info: ((Long) ((nextDeliveryDate.getTime() - expectedDeliveryDate.getTime()) / (1000 * 60 * 60 * 24))).intValue() = 27
Run Code Online (Sandbox Code Playgroud)
我认为您的结果应该不会有所不同,因为这是该Long.intValue()方法的作用:
public int intValue() {
return (int)value;
}
Run Code Online (Sandbox Code Playgroud)
这两行之间的控制流有些不对劲。
您可以在下面尝试此测试:
Calendar now = Calendar.getInstance();
Date fromDate = now.getTime();
now.add(Calendar.YEAR, 10);
Date toDate = now.getTime();
System.out.println("line 0: " + (toDate.getTime() - fromDate.getTime()));
System.out.println("line 1: " + (int)(toDate.getTime() - fromDate.getTime()));
System.out.println("line 2: " + new Long((toDate.getTime() - fromDate.getTime())).intValue());
int days = (int) ((toDate.getTime() - fromDate.getTime()) / (1000 * 60 * 60 * 24));
System.out.println("line 3: " + days);
days = ((Long) ((toDate.getTime() - fromDate.getTime()) / (1000 * 60 * 60 * 24))).intValue();
System.out.println("line 4: " + days);
Run Code Online (Sandbox Code Playgroud)
你可能会遇到int溢出.如果之间的差别toDate.getTime()和fromDate.getTime()大于2.147 bilion(即Integer.MAX_VALUE),这将是不可能来表达它作为一个整数,它只是包装和改变最小值-比如Integer.MAX_VALUE + 100会给你负的结果.
你应该首先对long进行所有操作,直到你确定它足够小,可以在int没有溢出的情况下进行转换.我认为你的例子都是正确的,第一个肯定比另一个更清楚.
另外,请记住表达式1000 * 60 * 60 * 24是整数,它们也可能溢出.例如,一个月内的毫秒数31 * 24 * 3600 * 1000就像这样写回来-1616567296.
编辑:让我解释一下您在编辑中附加的输出:
Info: nextDeliveryDate.getTime() - expectedDeliveryDate.getTime() = 2332800000
Info: (nextDeliveryDate.getTime() - expectedDeliveryDate.getTime()) / (1000 * 60 * 60 * 24) = 27
Info: ((int) (nextDeliveryDate.getTime() - expectedDeliveryDate.getTime()) / (1000 * 60 * 60 * 24)) = -22
Info: ((Long) ((nextDeliveryDate.getTime() - expectedDeliveryDate.getTime()) / (1000 * 60 * 60 * 24))).intValue() = 27
Run Code Online (Sandbox Code Playgroud)
我也将其nextDeliveryDate.getTime() - expectedDeliveryDate.getTime()称为x.所以我们可以将它声明为long x = 2332800000(声明int将给出编译错误,因为它太大而无法保存为4个字节).
在第一行,你有x / something,something是一个int,x是长的,所以something将转换为long,最后的结果是long.
在第二行,你有((int) x) / something,所以很长2332800000被转换成整数给予-1962167296然后你有-1962167296 / something.
在你的最后一行中,你的(Long) (x / something)实际情况与第一行完全相同.
| 归档时间: |
|
| 查看次数: |
3734 次 |
| 最近记录: |