【问题标题】:Why is Int32's maximum value 0x7FFFFFFF?为什么 Int32 的最大值是 0x7FFFFFFF?
【发布时间】:2012-10-25 04:00:17
【问题描述】:

我在 MSDN 文档中看到 maximum value of Int32 is 2,147,483,647,十六进制 0x7FFFFFFF

我认为,如果是Int32,它应该存储最终应该是4,294,967,295 和十六进制0xFFFFFFFF 的32 位整数值。

我的问题是为什么Int32 存储 31 位整数值?

【问题讨论】:

标签: c# types int32


【解决方案1】:

这是因为它是一个有符号整数。一个无符号的 32 位整数为您提供您期望的值。

查看此 MSDN 页面 - http://msdn.microsoft.com/en-us/library/exx3b86w(v=vs.80).aspx

要更深入地解释为什么会这样,请查看 Jackson Popes 答案中与 Two's Complement 数字表示相关的链接。

还有一些further reading

【讨论】:

  • int32 是一个二进制恭维数,所以说最高位是符号位是不公平的。那将是一个人的赞美数字。
  • @harold 不要误导,而是做出正确的陈述。
  • @harold 所以不要误导。
  • @harold 但是您可以完全省略该术语的使用,因为它具有误导性。这甚至不难做到。
  • 我同意,当你从 1 中减去 2 时,你会得到 -1,但在 Int 中就是 -1,并且十六进制表示不是 0x80000001,而是 0xFFFFFFFF ...这就是 @Servy 试图告诉的你。仅使用 MSB 作为标志和使用 2-compliment 数字之间存在很大差异。关于 2-compliment 很酷的一点是,你基本上只是用最大值的一半来抵消零,并且所有数学仍然可以按预期使用 unsigned int's
【解决方案2】:

因为使用一位来存储符号(Int32 可以小于零)。

http://en.wikipedia.org/wiki/Two%27s_complement

【讨论】:

  • 没有这样的符号位。实际表示是二进制补码。 doubles 和 float (IEEE) 都有。
【解决方案3】:

Int32 和 Int64 都是有符号的,因此它们可以处理从 -capacity/2 到 (capacity/2)-1(为零)的整数值,这就是为什么最大值不是您期望的值。但是你可以通过使用 unsigned int 只有正数来得到你想要的。

【讨论】:

    【解决方案4】:

    第一位是符号 - 一个 int32 已签名,即它可以是正数/负数(我可能不应该说“第一位”!)

    【讨论】:

      【解决方案5】:

      您没有考虑负数。 Int32有签到。

      来自 MSDN:http://msdn.microsoft.com/en-us/library/system.int32.minvalue.aspx MinValue-2,147,483,648;即十六进制0x80000000

      【讨论】:

        【解决方案6】:

        在 2 的补码有符号 n 位类型中,范围是从 -2n-1 到 2n-1-1,因为您可以用 n 位表示2n 个不同的值,其中一半用于有符号数,因为有符号位。剩下的 2n-1 一半用于非负数。由于 1 用于 0,因此正数只有 2n-1-1 个剩余值

        【讨论】:

          猜你喜欢
          • 2011-04-19
          • 2010-09-10
          • 1970-01-01
          • 2011-03-01
          • 1970-01-01
          • 2010-10-12
          • 1970-01-01
          • 2015-05-19
          • 2011-01-24
          相关资源
          最近更新 更多