简单Java整数和长算术

简单Java整数和长算术,java,int,long-integer,Java,Int,Long Integer,简单的代码没问题 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 为什么元素是

简单的代码没问题

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 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); 
是的,但只有在算术之后。所以你得到了int*int+int,这是一个int,然后它将把它转换成一个long。然而,在这一点上,你有一个整数溢出,也就是说,它超出了整数的界限

您需要将右侧的数字转换为长首

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

B


但在Java中,int可以表示最大32位。

我还没有足够的rep来评论:

Oracle Java教程确认它将数据转换为原语类型long。由于要添加int和long,编译器将在将数据转换为long之前添加数据。如果你真的想让它一直持续很长时间,你就必须输入cast


类型是通过在当前数据类型前面添加所需的基元类型而进行的转换。

它知道在哪里转换?在第三个表达式中,你根本不用long…在第二个表达式中,你不用long,直到为时已晚。你认为这是为什么?为什么它不应该这样做呢?它也烧焦了,所以是负值
long elements = 2L * Integer.MAX_VALUE + 150000;
long elements = 2 * (long)Integer.MAX_VALUE + 150000;
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
 // (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);