public class HelloWorld{
public static void main(String[] args)
{
int i1= (int)10000000000000L;
System.out.println(i1);
}
}这个是Java的今天看的
为什么这个不会出错呢?
结果为:1316134912
不合理啊
在.NET肯定会错说转换溢出那如果在程序中出现这样
上面的数据进行转换
正确的做法是怎么样呢?
按我想的这个时候程序应该是报错,而不是给i1赋值1316134912
谢谢

解决方案 »

  1.   

    java语法不知道,楼主可以转化时用tryparse来试试,http://www.cnblogs.com/legend_sun/archive/2008/12/23/1360533.html,要是问java的话还是到Java区比较好
      

  2.   

    这个强制类型转换是可以转的,编译器不报错,只是转换后的结果会损失精度。
    int型是32位的。而1000000000000转换成二进制后显然超过32了位,所以强制换转成int时,会从最后一位向前截取32位,截取到什么,就是什么。
    所以从级别高的类型向级别低的类型转换时,结果可能是不可预知的,但毕竟还是可以强制类型转的。
      

  3.   

    int型是32位的。而1000000000000转换成二进制后显然超过32了位,所以强制换转成int时,会从最后一位向前截取32位,截取到什么,就是什么。
    ----------------------------------
    我也知道是这样,所以说大家怎么处理
    因为我是刚从.NET转过来JAVA的
    在.NET他会报错,这样我感觉很合理
    但Java他不报错,而是给了一个错误的结果,这后果是很严重的啊大家是怎么处理这种转换的谢谢
      

  4.   

    知道会损失精度,就不要强制转换。
    如果非要转,可以事先判断,如果超出范围抛个异常long l =10000000000000L;
    if(l > Integer.MAX_VALUE){
    throw new Exception("超出int范围");
    }else{
     System.out.println((int)l);
    }
      

  5.   

    RE:4楼
    那也就是你们会对这种转换的话会写一个方法如
    public class Convert{
        public static int toInt(long l)
        {
            if(value > Integer.MAX_VALUE){
                throw new Exception("超出int范围");
            }else{
                 return((int)l);
            }
        }
    }
    这样子吗?
    因为我是一直用C#,刚开始要转Java
    所以想问清楚大家是怎么处理的
    谢谢
      

  6.   

    我记得c/c++也是不会报错的,C#不清楚,java跟c/c++一样
      

  7.   

    设计的时候考虑好,考虑是否有这种情况,有的话就避免这种强转。我的话,很少去判断,因为写代码之前会考虑数据的取值范围,避免出现这种情况 
    ---------------------------------
    这种情况没办法判断的,万一出现这种情况你不会怎么处理?
    像我上面写的一个转换,而不是用Java自身的强制转换?
      

  8.   

    你要坚持说没有办法事先判断,那就转之前校验是否超出范围吧。
    记得大值,最小值都校验。
    value > Integer.MAX_VALUE || value < Integer.MIN_VALUE