日期:2014-05-20 浏览次数:20871 次
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。