定义
原码:用数值位和符号位表示一个带符号的数
反码:正数的反码与原码相同,负数的反码是对该数的原码除符号位外各位取反
补码:正数的补码与原码相同,负数的补码是对该数的原码除符号位外各位取反,末位加1
Java测试:
int i=1,t=0;
for(;t<30;)
{
i=i*2;
t++;
System.out.println("("+t+") "+i);
}
//得到最大在2^30到2^31,根据经验应该是比2^31略小,2^31=2147483648
i=i-1;
i=i*2;
System.out.print(i++);
System.out.println(" *-1 "+-1*i);
System.out.print(i++);
System.out.println(" *-1 "+-1*i);
System.out.print(i++);
System.out.println(" *-1 "+-1*i);
System.out.print(i++);
System.out.println(" *-1 "+-1*i);
System.out.print(i++);
System.out.println(" *-1 "+-1*i);
System.out.print(i++);
System.out.println(" *-1 "+-1*i);
System.out.print(i++);
System.out.println(" *-1 "+-1*i);
输出:
(1) 2
(2) 4
(3) 8
……
(28) 268435456
(29) 536870912
(30) 1073741824
2147483646 *-1 -2147483646 //2^31-2
2147483647 *-1 -2147483647 // 2^31-1
-2147483648 *-1 2147483648 //2^31
-2147483647 *-1 2147483647 // 2^31+1
-2147483646 *-1 2147483646 // 2^31+2
-2147483645 *-1 2147483645 // 2^31+3
-2147483644 *-1 2147483644 // 2^31+4
2^31-2 二进制表示为:0111 1111 1111 1111 1111 1111 1111 1110
2^31-1 二进制表示为:0111 1111 1111 1111 1111 1111 1111 1111
2^31 二进制表示为:1000 0000 0000 0000 0000 0000 0000 0000
所以不是原码
对于2^31
如果是反码
1000 0000 0000 0000 0000 0000 0000 0000 表示负数取反得
1111 1111 1111 1111 1111 1111 1111 1111 换算为十进制是 - 2^31-1
如果是补码
1000 0000 0000 0000 0000 0000 0000 0000
表示 - 2^31
对于2^32 1000 0000 0000 0000 0000 0000 0000 0001
反码 1000 0000 0000 0000 0000 0000 0000 0000
原码 1111 1111 1111 1111 1111 1111 1111 1111 1111
表示- 2^31-1
与实验相符
经过计算,按照补码其他的均相符。