【发布时间】:2014-07-15 10:17:55
【问题描述】:
我一直在尝试这种 int 和 long 转换,我尝试将 int 变量分配给 long 变量。代码如下:
public static void main(String []args){
int i = 1024;
long j = i;
long k = i*i*i*i;
System.out.println("j= " +j+ ", k= " +k);
}
因此,在打印 j 时,它只给出了 1024 的输出。但是在打印k 时,它显示了溢出(k=0)。我通过使用这种技术解决了这个问题,我将每个i 显式转换为long。即
public static void main(String []args){
int i = 1024;
long j = i;
long k = ((long)i)*((long)i)*((long)i)*((long)i);
System.out.println("j= " +j+ ", k= " +k);
}
现在,它显示了j 和k 的正确值。
所以,我想知道为什么需要在第二种情况下转换int 而不是在第一种情况下。 k,作为 long 可以在这个繁重的分配之后保留这个值。但是,为什么没有正确分配呢?
【问题讨论】:
-
先将
i转换为 long 就足够了 -
您发现的缺陷模式——可能溢出的整数乘法“为时已晚”转换为更大的类型——在 C# 和 Java 中都比较常见;我们发现每百万行代码分析超过 5 个实例。具有相似发现率的相关缺陷是两个整数的除法和“为时已晚”转换为双精度数;人们常常惊讶于三百除以五百并分配给一个双倍是零,而不是 0.6。
标签: java int long-integer