bigger=-4;
因为int型最大为2147483647,超出则改变符合位了
因为int型最大为2147483647,超出则改变符合位了
解决方案 »
- 怎么把一个applet改为application,以这个applet为例子
- java递归求解1-5阶乘之和
- static 的 困惑
- 一个小函数问题?
- Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
- java调用sqlserver的问题?急?
- 麻烦高手看看:在静态回调函数里刷新JTextArea的内容没响应
- 整日与电脑为伍,致使头发日渐稀少,请问个位该怎么办?
- 关于java 短暂停止运行的问题。
- How to suspend a thread and wake up in java
- 怎样设置环境变量
- 老师布置的题目不会 请大家帮忙
import com.wizesoft.util.*;
//这里我导入一个打印为二进制的函数BP.rint();
/*
import java.util.*;
public class BP{
public static void rint(int i){
for(int j=31;j>-1;j--){
if (((1<<j)&i)!=0)
System.out.print("1");
else
System.out.print("0");
if (j%8==0&&j!=0)System.out.print(",");
}
}
public static void rint(long i){
for(int j=63;j>-1;j--){
if (((1<<j)&i)!=0)
System.out.print("1");
else
System.out.print("0");
if (j%8==0&&j!=0)System.out.print(",");
}
}
}
*/
public class Overflow {
public static void main(String[] args) {
int big = 0x7fffffff; // max int value System.out.println("big = " + big);
BP.rint(big);
prt("\n");
int bigger = big * 4;
prt("bigger = " + bigger);
BP.rint(bigger);
prt("\n");
long biggest=big*4;
prt("biggest = " + biggest);
BP.rint(biggest);
}
static void prt(String s) {
System.out.println(s);
}
} ///:~运行结果为:---------- Run Java Program ----------
big = 2147483647
01111111,11111111,11111111,11111111bigger = -4
11111111,11111111,11111111,11111100biggest = -4
11111111,11111111,11111111,11111100,11111111,11111111,11111111,11111100
Output completed (0 sec consumed) - Normal Termination说明:
bigger=big*4,即相当于big左移2位,右边用00补齐
+0x7FFFFFFF
------------
0xFFFFFFFE
+0x7FFFFFFF
------------
0x7FFFFFFD
+0x7FFFFFFF
------------
0xFFFFFFFC = 11111111111111111111111111111100 = -4Java虚拟机的整数运算是“二进制补码运算”。jvm中出现整数运算的溢出并不导致异常,其结果被截短以符合数据类型。
int big = 0x7FFFFFFF;
big = big * 2; // big = big<<1;
big = 0xFFFFFFE;
big = big * 2; // big = big<<1;
big = 0xFFFFFFC = -4;
<<
public class TestMulti extends TestCase {
public TestMulti(String name) {super(name);} public void testMulti() {
assertEquals(Byte.MIN_VALUE*2, Byte.MIN_VALUE<<1);
assertEquals(Byte.MAX_VALUE*2, Byte.MAX_VALUE<<1);
assertEquals((byte)0*2, (byte)0<<1); assertEquals(Short.MIN_VALUE*2, Short.MIN_VALUE<<1);
assertEquals(Short.MAX_VALUE*2, Short.MAX_VALUE<<1);
assertEquals((short)0*2, (short)0<<1); assertEquals(Integer.MIN_VALUE*2, Integer.MIN_VALUE<<1);
assertEquals(Integer.MAX_VALUE*2, Integer.MAX_VALUE<<1);
assertEquals(0*2, 0<<1); assertEquals(Long.MIN_VALUE*2, Long.MIN_VALUE<<1);
assertEquals(Long.MAX_VALUE*2, Long.MAX_VALUE<<1);
assertEquals(0L*2, 0L<<1);
}
}
>>
说到这个问题,不禁想到josha bloch的一个问题,如何验证一个整数是2的幂:
n & (-n) == n
这个问题更有助于理解带符号的二进制补码数运算。
那这个等于几:
10000000000000000000000000000100=?
呵呵,那你说等于多少?这多简单啊。10000000000000000000000000000100 = 0x80000004
= 0x80000000 + 0x04 = -2147483644;:)BTW, 0x80000000 = Integer.MIN_VALUE