日期:2014-05-20  浏览次数:20871 次

救急。。我感保证很多资深JAVA程序员答不上来的基础问题。。。
JAVA中的int是4位的,long是8位的,而且JAVA都是有符号位的,所以int的范围是-2147483648到2147483647,long的范围是-9223372036854775808到9223372036854775807

谁能解释一下以下程序为什么是这些结果:
int i = 2147483647; 
System.out.println(i);//编译通过,输出到控制台为2147483647
-------------------------------------------------------
long i = 2147483647000;//编译通不过,错误是int超出范围
-------------------------------------------------------
long i = (long)2147483647000;//编译还是通不过,错误是int超出范围
-------------------------------------------------------
long i = 2147483647 * 10; //编译通过,输出到控制台为-10
-------------------------------------------------------
long i = 2147483647;
i = i * 10; //编译通过,输出到控制台为21474836470

我现在想做的是把两个很有可能超出上限的int变量相加存放到long型的变量中,难道我只能采取最后一种方法?现在困扰我的是为什么第二种方法会编译错误以及第四种方法结果为什是-10

------解决方案--------------------
"long i = 2147483647; 
i = i * 10; "
挺好的啊


至于问题
默认的INT。 
LONG的写法是:long l = 9223372036854775806L; 
注意后面的一个"L,必须加上去"。 

------解决方案--------------------
其实就是编辑器默认的数字类型为int,如果是long要加l或者L
2147483647 * 10这个计算的结果为int,所以显示-10
i * 10这个计算结果为long,所以结果正确

计算结果的类型是由前面的类型决定的
------解决方案--------------------
long i = 2147483647 * 10

先做一个INT运算再赋值
------解决方案--------------------
Java code
      int i = 2147483647; 
      System.out.println(i);//编译通过,输出到控制台为2147483647 
    //  ------------------------------------------------------- 
      long j = 2147483647000L;  //  long形的定义是需要在数字之后加个L 或者l的
      System.out.println("j  " +j); 
    //  ------------------------------------------------------- 
      long k = (long)2147483647000L;//同样的道理,如果不加L的话,他会认为是int形,所以就溢出来
      System.out.println("k  " +k);
    //  ------------------------------------------------------- 
      long l = 2147483647L * 10; //这是int形的运算,你在运算之后溢出了,变成了-10,(具体的可能比较烦,)再转化为long形,    System.out.println("l  " +l);
    //  ------------------------------------------------------- 
      long m = 2147483647;   //这是long形,
      m = m * 10;              //这是long形的运算
      System.out.println("m  " +m);

------解决方案--------------------
(1)
long i = 2147483647000;//编译通不过,错误是int超出范围 
这个很正常,因为后面的int超过了范围
至于你说的问题,你应该这样写:
long l = 2147483647000L;
long i = 3; 
都是可以的。

(2)
long i = (long)2147483647000;//编译还是通不过,错误是int超出范围 
这个同上,你不要试图把一个超过范围的int强制转成long.

(3)
long i = 2147483647 * 10; //编译通过,输出到控制台为-10
运算时,是通过二进制运算的
比如:int i=2147483647+1//-2147483648
又转回到最小了。
------解决方案--------------------
对于问题2) 
long i = 2147483647000;//编译通不过,错误是int超出范围
显而易见了吧,编译器不高兴了,他认为2147483647000是一个int,且超出了int的范围!

对于问题4)
long i = 2147483647 * 10; //编译通过,输出到控制台为-10 
举一个简单的例子,位数少的来说明
byte i = (byte)(127 * 10); // 这里需要强制转换(byte),因为int是最小的提升范围
127 * 10 = 1270 二进制表示为 00....10011110110 (32位)
byte只是8位,所以只取低8位 ,得到: 11110110
11110110 (最高位,最左的1是符号位,表示负数)
取反 00001001 (补码表示:按位取反 加1)
加一 00001010 (这里十进制表示10)
不要忘了负号 所以得到结果 -10


------解决方案--------------------
额,这么简单的问题……

int i = 2147483647;
System.out.println(i);//编译通过,输出到控制台为2147483647
-------------------------------------------------------
long i = 2147483647000;//编译通不过,错误是int超出范围 先定义了一个为2147……的int值(溢出了),再把它赋值给i。
-------------------------------------------------------
long i = (long)2147483647000;//编译还是通不过,错误是int超出范围 先定义了一个为2147……的int值(溢出了),在将他转换为long,并赋值给i。