为什么Int32类型的最大值是2³¹ − 1?

26

我知道Int32的长度为32位(4个字节)。我猜它有2³²个值,但由于其中一半必须为负数,所以我认为这与此有关。

我想知道为什么Int32的最大正数是2³¹-1。


1
为什么无符号n位整数的最大值是2^n-1而不是2^n? - phuclv
相关:“2的补码”是什么? - Theodor Zoulias
4个回答

65

最高位用于表示符号(1表示负数),因此只剩下31位来表示实际的值。

Int32.MaxValue =  2^31 - 1 = 01111111111111111111111111111111
                  1        = 00000000000000000000000000000001
                  0        = 00000000000000000000000000000000
                 -1        = 11111111111111111111111111111111
Int32.MinValue = -2^31     = 10000000000000000000000000000000

1
如果我们假设0是正数,那么在-1和0之间的虚线上有相等数量的值。 - Shruti Saagar

38

2³² 可能的值

− 2³¹ 用于负整数的值

− 1 用于零

= 2³¹ − 1 可用于正整数的值


31

2³²约为42亿。这是一个由32位数字(即一个32位二进制数)表示的数的最大值。

这些值可以是任何范围内的任何值。在无符号32位数字中,有效值的范围是从0到2³²-1(而不是从1到2³²,但是值的数量相同,约为42亿)。

在有符号32位数字中,其中一位用于指示数字是否为负数。这将使值的数量减少2¹倍,或减半。这意味着现在只有2³¹个值,约为21亿。这意味着范围现在约为-21亿到21亿。值的数量相同,范围不同。


@HashimAziz:缺陷在于,不涉及二进制补码表示,它没有解释为什么最大值是2³¹ - 1,而最小值是-2³¹。 - ShadowRanger

1

在编程中,你有2^31个零以下的值(最小值为-2^31),2^31-1个零以上的值和零本身。这使得2^31 + 2^31-1 + 1 = 2*2^31 = 2^32个值 :) ...

另一个解释涉及负数如何表示(使用二进制补码):简而言之,最高有效位表示负数,因此你还剩下2^31个正数(包括零),这给我们带来了范围0..2^31-1。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接