【问题标题】:What is the difference between Int32 and UInt32?Int32 和 UInt32 有什么区别?
【发布时间】:2011-01-19 10:04:50
【问题描述】:

Int32UInt32 有什么区别?

如果它们与容量范围功能相同,那么问题是UInt32 的创建原因是什么?我什么时候应该使用UInt32 而不是Int32

【问题讨论】:

  • 你知道有符号整数和无符号整数的区别吗?
  • @Moron:是的,我知道。只是不小心将 UInt32 视为“非托管 int32”而不是“无符号 int32”。哈哈!!
  • 投票关闭为“过于本地化”,因为这个问题仅对认为 UInt32 表示“非托管 int32”的人有用。我认为这些人已经不多了。
  • @Jhon:我同意你的看法。

标签: .net int32 uint32


【解决方案1】:

UInt32 不允许负数。来自MSDN

UInt32 值类型表示无符号整数,其值范围为 0 到 2 的 32 次方或 2**32(等于 4,294,967,295)。

【讨论】:

    【解决方案2】:

    整数是 -2147483648 到 2147483647,无符号整数是 0 到 4294967295。

    这个article 可能会对你有所帮助。

    【讨论】:

      【解决方案3】:

      uint32 是一个 32 位的无符号整数,这意味着您可以表示 2^32 个数字 (0-4294967295)。

      但是,为了表示负数,32 位中保留了一位来表示正数或负数。这会给您留下 2^31 个可能的负数和正数。结果范围是 -2147483648 到 2147483647(正范围包括值 0,因此只有 2147483647)。这种表示称为int32

      您应该为定义上不能为负数的数字选择无符号数,因为它为您提供了更广泛的范围,但您应该记住,由于int32 无法保持,因此无法从int32 转换为int32 uint32 的范围,反之亦然。

      【讨论】:

        【解决方案4】:

        uint32 是无符号 32 位整数。它不能用于表示负数,但可以容纳更大的正数。

        【讨论】:

          【解决方案5】:

          它们之间没有区别。

          不同之处在于它的表示方式,例如通过打印到终端。

          例如,为简单起见坚持使用 8 位值:

          • 255 是0xff,-1 也是0xff
          • 将 -1 解释为“零左侧的一个”,而 +1 是“零右侧的一个”。
          • -1 + -1 = -2,即“零左二”,也就是0xfe。好吧,如果我们把它转换成无符号数学,那么它就变成了 0xff + 0xff = 0xfe。

          所以你看,有符号和无符号之间没有区别,只是我们最终如何表示它们会有所不同,在这种情况下,类型表示它是如何表示的。

          当编译器必须通过符号扩展从较小的大小转换为较大的大小时,签名变得很重要。所以在这种情况下,重要的是要指明一个类型,这样编译器才能做正确的事情。

          【讨论】:

          • “它们之间没有区别” 大错特错。有符号整数保留 1 位用于确定数字是正数还是负数。无符号整数不会为此保留一点,这意味着它们只能是正数而不能是负数。这一位是一个巨大的差异,因为它以负数为代价使数字的最大值加倍(我们使用 2 的幂,31^2 是 4294967295)。
          • 你对自己很自信。在寄存器级别,无符号整数和有符号整数的存储方式没有区别。没有为负数指定位翻转。根据您的建议,-1 是无符号的,其最高有效位已设置。这是非常错误的。 -1 是零减 1,这导致 8 位架构中的 0xFF。这样,当我们向 0xFF 添加正数时,结果为 0。负数只是简单地映射到引擎盖下的无符号数。 8位数学中的-1 + -2是什么? 0xff + 0xfe = 0xfd。这称为 2s 补码算法。
          • 这个答案被低估了,看到人们投票否决它很伤心。不过,我要添加另一个区别:编译器将对有符号类型使用算术移位。
          猜你喜欢
          • 2022-12-12
          • 1970-01-01
          • 1970-01-01
          • 2013-02-01
          • 2013-03-31
          • 2015-02-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多