为什么Integer.MIN_VALUE是-2 ^ 32而Integer.MAX_VALUE是2 ^ 31-1?

时间:2016-03-31 06:38:43

标签: java

我在JDK中看到Integer.MIN_VALUE是0x80000000。考虑到原始是0x80000000,那么相反的是0x8fffffff,最后补码是 0x8fffffff +( - 1)= -2 ^ 32 ?那么 -2 ^ 32 是否为1000 0000 0000 0000 0000 0000 0000 0000 in bit?

3 个答案:

答案 0 :(得分:5)

使用32位,您可以表示2 ^ 32个整数。

  • 2 ^ 31为否定
  • 2 ^ 31 - 1是积极的
  • 1是0

如果你总结它们,你会得到2^31-1

因此,最大(最正)整数是-2^31,最小(最负)整数是private void btnNext_Click(object sender, EventArgs e) { List<Branch> listBranchs = new List<Branch>(); //Adding Branch to listBranchs ... listBranchs.ForEach(delegate(Branch branch) { branchInterf.insertBranch(branch,user); BranchDAO bdao = new BranchDAO(); branch.intBranchID = bdao.getBranchID(); //here is the problem, why bdao.getBranchID() return 0 ? }); }

答案 1 :(得分:1)

考虑一个简单的4位场景:

计算机将负整数存储为2的补码。为了获得2的补码,我们遵循以下程序:

表示否定8 =&gt;
1000(二进制正8)
0111(翻转所有位= 1&#39; s补码)
+ 1(加1)

1000(这是整数存储在计算机中的负8,MSB =符号位= 1表示-ve)

因此,2补码= 1补码+ 1

2补码的一个优点是它只有1表示0不同于1的补码(其中+ ve和-ve 0,即0000和1111分别称为0交叉问题)。 因此,这就是你在负面获得额外价值的原因

所以最后得出4位情景:

  • 0000到0111表示0到+ ve 7(MSB用作符号位,MSB = 0表示 雾化+ ve)
  • 1000到1111表示-8到-1(MSB = 1表示-ve)
  • 0 in 2的补码是0000,2&s;补码:0000-> 1111 + 1 = 10000(额外的 进位1超出范围因此导致000),即仅1 代表0,即0000

计数:0到7是2 ^ 3-1 = 7 + ve
计数:-8到-1是2 ^ 3 = 8 -ve
计数:计数为0是1
计数总和=&gt; 1 + 7 + 8 = 16 = 2 ^ 4

因此对于你的问题:2 ^ 31是+ ve整数,2 ^ 31-1是-ve整数,还有1个值为0。

旁注:

从2的补码转换:1000-> 0111 + 1 = 1000(8)
值为8并放入-ve符号,即最终值为-8

从2的补码转换:1111-> 0000 + 1 = 0001(1)
值为1并放入-ve符号,即最终值为-1

答案 2 :(得分:0)

特定精度的整数是偶数,因为算术基于2的幂;因此你不能拥有与负数一样多的正整数,零会偷走一个位置。