【问题标题】:Simple Java integer and long arithmetics简单的 Java 整数和长算法
【发布时间】:2014-02-10 12:06:19
【问题描述】:

简单的代码没问题

long x =  Integer.MAX_VALUE;
System.out.println(x * 2 + "...." + Long.MAX_VALUE);

= 4294967294....9223372036854775807

但是这里发生了什么?为什么-2

System.out.println(2 * Integer.MAX_VALUE + "...." + Long.MAX_VALUE);
=   -2....9223372036854775807

为什么元素是 149998,编译器不会将这些转换为 long 吗?

    long elements = 2 * Integer.MAX_VALUE + 150000;
System.out.println(elements + "...." + Long.MAX_VALUE);
149998....9223372036854775807

-谢谢

【问题讨论】:

  • 它知道在哪里转换?在第三个表达式中,您根本不使用 long....而在第二个表达式中,您不要使用一个,直到为时已晚。
  • 您认为为什么会发生这种情况?为什么不应该这样做?

标签: java int long-integer


【解决方案1】:

将变量从整数提升为长整数。

long elements = 2 * Integer.MAX_VALUE + 150000; 

应该是

long elements = 2L * Integer.MAX_VALUE + 150000;

原始陈述的评价,

long elements = 2 * Integer.MAX_VALUE + 150000; 

等价于

long elements = (long)(2 * Integer.MAX_VALUE + 150000); 

【讨论】:

    【解决方案2】:
    and why elements is 149998, doesn't the compiler converts these to long?
    

    确实如此,但只是在算术之后。所以你有 int*int + int,它是一个 int。然后它会将其投射到很长的位置。但是,此时您已经遇到整数溢出(即超出整数范围)

    你需要把右边的数字先转换成long

    long elements = 2L * Integer.MAX_VALUE + 150000;
    

    long elements = 2 * (long)Integer.MAX_VALUE + 150000;
    

    B

    【讨论】:

      【解决方案3】:
      Integer.MAX_VALUE =2147483647=01111111 11111111 11111111 11111111 
      

      还有

      2*Integer.MAX_VALUE=4294967294=2*(01111111 11111111 11111111 11111111)  
                                    =this will result a 33-bit value
      

      但是在Java中int可以代表最大32位。

      【讨论】:

      • 也是它的烧焦,因此是负值
      【解决方案4】:

      我还没有足够的代表发表评论:(。

      Oracle Java 教程确认它将数据转换为原始类型 long。由于您要添加 int 和 long,因此编译器将在将数据转换为 long 之前添加数据。如果您真的希望它一直很长,则必须键入 cast。

      前;

       // (long) is typcasted
      long elements = 2 * (long) Integer.MAX_VALUE + 150000;
      
      //prints elements as a long t + "" + max value
      System.out.println(elements + "...." + Long.MAX_VALUE); 
      

      类型是通过在当前数据类型前面添加所需的原始类型来进行强制转换。

      【讨论】:

        猜你喜欢
        • 2014-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-16
        相关资源
        最近更新 更多