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
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
楼主【wbwb3448】截止到2008-06-28 09:34:05的历史汇总数据(不包括此帖):
发帖数:1 发帖分:88
结贴数:0 结贴分:0
未结数:1 未结分:88
结贴率:0.00 % 结分率:0.00 %
如何结贴请参考这里:http://topic.csdn.net/u/20080501/09/ef7ba1b3-6466-49f6-9d92-36fe6d471dd1.html
i = i * 10; "
挺好的啊
至于问题
默认的INT。
LONG的写法是:long l = 9223372036854775806L;
注意后面的一个"L,必须加上去"。
2147483647 * 10这个计算的结果为int,所以显示-10
i * 10这个计算结果为long,所以结果正确计算结果的类型是由前面的类型决定的
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);刚刚试了一下,有几点你要注意的
还有,我说的,都是针对你的来说的,我已经改过来了
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
又转回到最小了。
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
System.out.println(i);//编译通过,输出到控制台为2147483647
-------------------------------------------------------
long i = 2147483647000;//编译通不过,错误是int超出范围 先定义了一个为2147……的int值(溢出了),再把它赋值给i。
-------------------------------------------------------
long i = (long)2147483647000;//编译还是通不过,错误是int超出范围 先定义了一个为2147……的int值(溢出了),在将他转换为long,并赋值给i。
-------------------------------------------------------
long i = 2147483647 * 10; //编译通过,输出到控制台为-10 定义了两个int,2147……和10,并相乘,由于两个都是int,所以得到一个int(这是就发生了溢出),并赋值给i。这是可以通过编译的,因为你定义的每个值都没有溢出,但在运行中溢出了。
-------------------------------------------------------
long i = 2147483647;
i = i * 10; //编译通过,输出到控制台为21474836470 这是肯定可以的,先定义了一个2147……的int,并赋值给i(都没有溢出),这是i是long型,用i * 10得到得就是long型(long * int,自动转换10为long),所以都没有溢出。
long i = 2147483647000;//编译通不过,错误是int超出范围
JAVA中要制定long的类型,如long i = 2147483647000L