为什么Int32.MaxValue等于2147483648?

3

我想知道为什么.NET中Int32的最大值是2147483647而不是2147483648。因为2³¹ = 2147483648。

谢谢


8
sbyte范围为-128到127的原因相同。请花点时间考虑这个例子,因为考虑小数字会更容易。想想在范围[-128, 127]内有多少不同的数字被表示... - Jon Skeet
1
2^31 = 10000000000000000000000000000000 这个二进制数不能用作前导位,因为它是用来表示符号的。所以我们需要使用一个比这个小1的数(11111111111111111111111111111111)。 - leppie
感谢回复。是的,同样的问题又来了。为什么sbyte的最大值是127?为什么不是128?00000000 = 0 00000001 = 1 ... 01111111 = 127 对吧? - Vidya Bhatt
3
@VidyaBhatt 01111111 二进制数 = 127 十进制数。提示:二进制数中最低位(最右侧)为1的数永远不可能是偶数,它们必须是奇数。 - Stefan Podskubka
4个回答

12

Int32存储在32位中,而不是31位,并且它的一半范围被负数占据。在剩余的范围内,你会失去一个值变成0,留下2147483647作为最大的正数。

Int32的范围为-2147483648到2147483647。


我知道int类型占用32位,最左边的一位是符号位。但我不理解“将一个值变为零”是什么意思,因为所有的0本身就是0。000...0000 = 0 000...0001 = 1 000...0010 = 2 ... 011...1110 = 1073741824 011...1111 = 2147483648 - Vidya Bhatt
你应该花些时间在维基百科上学习二进制和有符号整数的表示。用于有符号整数的表示通常称为二进制补码。然而,对于一个8位数字,你可以有2^8或256个值。我们将其中一半(2^7或128)放在零的负面,零占一个,另一半从零开始。由于零占了一个,我们剩下2^7-1个正数,即127个。这可以扩展到32位,其中我们得到2^31-1个正数。其他数字表示法也可以有-0和+0。 - TheEvilPenguin

7

这个范围包括正数和零0,因此范围是从02147483647,由于零被视为正数,因此向负数方向的范围从“-1”到-2147483648

因此,总体上,正面和负面采取相同数量的值。


6

Int32的实际数据存储在31位中,因为普通的Int32也应该包含负数,1位用作符号位,剩下的31位用作数据。然而,如果您使用无符号的Int32,则将在其中拥有完整的32位数据。


1

这意味着int02147483647可以有最大2147483648个正值,而int.Min是-2,147,483,648,因为它不包括0.


下投票的原因是什么? - Adil
1
不确定,但是计数了。 - leppie

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