【问题标题】:Why does the range of int has a minus 1?为什么 int 的范围是负 1?
【发布时间】:2013-10-20 10:41:11
【问题描述】:

我读到 int 的范围取决于一个字节。

因此将 int 设为 4 个字节长,即 4 * 8 位 = 32 位。

所以范围应该是:2 ^ (32-1) = 2 ^ (31)

为什么有些人说它是 2^31 - 1?

谢谢!

【问题讨论】:

  • 一位最大值是1,即(2^1) - 1 = 2 - 1 = 1,但不是因为2^(1-1) = 2^0 = 1

标签: c numbers int range number-systems


【解决方案1】:

您的意思是 232-1,而不是 232-1

但您的问题是关于人们为什么使用 231。如果 int 是有符号的,则会丢失一整位。您丢失第一位以指示数字是正数还是负数。

有符号整数(32 位)的范围从 -2,147,483,648 到 +2,147,483,647。 无符号整数(32 位)的范围从 0 到 4,294,967,295(即 232 -1)。

【讨论】:

    【解决方案2】:

    因为整数是 32 位的。它可以存储总共 2^32 个值。所以一个整数范围从 -2^31 到 2^31-1,总共有 2^32 个值(负数范围内的 2^31 个值+正数范围内的 2^31 个值,包括 0)。但是,第一位(最高有效位)保留给整数的符号。再次,您需要了解负整数是如何存储的。它们以 2 的补码形式存储,因此 -9 将存储为 9 的 2 的补码。 所以 9 在 32 位系统中存储为 0000 0000 0000 0000 0000 0000 0000 1001 -9 将存储为 1111 1111 1111 1111 1111 1111 1111 0111(9 的 2 补码)。

    再次由于对整数的一些算术运算,如果它恰好超过最大值(2^31-1),那么它将循环为负值。所以如果你把 1 加到 2^31-1 上,它会给你 -2^31。

    【讨论】:

      【解决方案3】:

      因为从0开始计数

      int的范围是2,147,483,6472^32,即2,147,483,648。因此我们减去 1

      另外1位的损失是正负号

      查看这篇关于整数的interestinf wiki 文章:-

      正整数最常见的表示是一个字符串 位,使用二进制数字系统。内存字节的顺序 存储位不同;见字节顺序。宽度或精度 整数类型是其表示形式的位数。一个积分 n 位类型可以编码 2n 个数字;例如无符号类型 通常表示非负值 0 到 2n-1。其他 有时使用整数值到位模式的编码,例如 例如二进制编码的十进制或格雷码,或作为打印字符 ASCII码等。

      有四种众所周知的方法可以在二进制中表示有符号数 计算系统。最常见的是二进制补码,它允许 具有 n 位的有符号整数类型,用于表示来自 −2(n−1) 的数字 通过 2(n-1)-1。二进制补码算术很方便,因为 表示之间存在完美的一一对应关系 和值(特别是,没有单独的 +0 和 -0),并且因为 加减乘法不需要区分 在有符号和无符号类型之间。其他可能性包括偏移 二进制、符号大小和一个的补码。

      【讨论】:

        【解决方案4】:

        232-1 与 232 - 1 不同(0 包含在范围内,我们减去 1)

        为了您的理解,让我们用小数字 4 代替 32

        24-1 = 8 而 24-1 = 16-1 = 15.

        希望这会有所帮助!

        【讨论】:

        • 如果你愿意,可以使用<sup> </sup>
        • @Grijesh Chauhan - 嘿,谢谢。我是堆栈溢出的新手。尚未学习格式化样式:)
        • 欢迎来到 SO,learn formatting tips
        【解决方案5】:

        int 是有符号数据类型。 第一位表示符号,后面是值的位。 如果符号位为 0,则该值只是所有设置为 1 的位的总和(2 的幂)。

        例如0...00101 是 20 + 22 = 5

        如果第一位为 1,则值为 -232 + 所有设置为 1 的位的总和(2 的幂)。

        例如1...111100 为 -232 + 231 + 230 + ... + 22 = -4

        全 0 将导致零。

        当您计算之后,您会看到(包括)范围之间的任何数字 - 231 和 20 + ... + 2 31 = 232 - 1 可以用这 32 位创建。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-09-04
          • 1970-01-01
          • 1970-01-01
          • 2011-09-07
          • 2011-10-05
          • 1970-01-01
          • 1970-01-01
          • 2011-03-07
          相关资源
          最近更新 更多