【问题标题】:What is the maximum value for an int32?int32 的最大值是多少?
【发布时间】:2010-09-10 19:27:02
【问题描述】:

我永远记不住号码。我需要一个记忆规则。

【问题讨论】:

  • 无符号:2³²-1 = 4·1024³-1;有符号:-2³¹ .. +2³¹-1,因为符号位是最高位。只需学习 2⁰=1 到 2¹⁰=1024 并结合即可。 1024=1k, 1024²=1M, 1024³=1G
  • 我一般记得每3位大约是一个十进制数字。这让我得到了正确的数量级:32 位是 10 位。
  • @JoachimSauer 如果您至少学会识别这些数字,它当然可以帮助调试。
  • "如果磁盘已满,删除所有mbytes将归档"(2个字母、1个字母、4个字母、7个字母、4个字母、8个字母、3个字母、6个字母、4个字母、7个字母字母)
  • 一种情况,当int32不够用时:bbc.com/news/world-asia-30288542

标签: integer


【解决方案1】:

在路径上使用 Groovy:

groovy -e " println Integer.MAX_VALUE "

(在 Java 上下文中,Groovy 对于快速参考非常有用。)

【讨论】:

    【解决方案2】:

    2147483647

    以下是您需要记住的:

    • 20 亿
    • 接下来的三个三元组是这样增加的:100s、400s、600s
    • 第一个和最后一个三元组需要添加 3,以便四舍五入到 50(例如 147 + 3 = 150 & 647 + 3 = 650)
    • 第二个三元组需要从其中减去 3 以将其向下舍入到 80(例如 483 - 3 = 480)

    因此是 2、147、483、647

    【讨论】:

      【解决方案3】:

      我在 C# 中创建了几个天才方法,您可以在生产环境中利用它们:

      public static int GetIntMaxValueGenius1()
      {
          int n = 0;
          while (++n > 0) { }
          return --n;
      }
      
      public static int GetIntMaxValueGenius2()
      {
          int n = 0;
          try
          {
              while (true)
                  n = checked(n + 1);
          }
          catch { }
          return n;
      }
      

      【讨论】:

      • 我在想某种方法,可以猜测数万亿个随机整数,并返回最大的一个。
      【解决方案4】:

      记住它是第八个梅森素数。

      如果这太难了,它也是仅有的四个已知的梅森素数中的第三个。

      根据评论请求进行编辑:

      Euclid-Euler 定理指出,每个偶数都具有 2^(n − 1) (2^n − 1) 的形式,其中 2^n − 1 是素数。 2^n − 1 形式的素数称为梅森素数,要求 n 本身为素数。

      我们知道 INT32 的长度当然是 32 位。鉴于对 2 的补码的普遍接受的理解,带符号的 INT32 是 32 位 - 1 位。

      要找到具有给定位数的二进制数的大小,我们通常将 2 的 n 次幂减去 1,其中 n 等于位数。

      因此,大小计算为 2^(32 - 1) - 1 = 2^31 - 1。31 是素数,如上所述,这种形式的素数是梅森素数。我们可以通过简单地计算它们来证明它是其中的八个。有关详细信息,请询问欧拉,或者可能是伯努利(他写信给谁)。

      见:https://books.google.ie/books?id=x7p4tCPPuXoC&printsec=frontcover&dq=9780883853283&hl=en&sa=X&ved=0ahUKEwilzbORuJLdAhUOiaYKHcsZD-EQ6AEIKTAA#v=onepage&q=9780883853283&f=false

      【讨论】:

      • 任何可以链接到的参考...? (直接,无需谷歌/维基百科...)
      【解决方案5】:

      这就是我的记忆……
      在十六进制中,一个数字代表四位,所以 4 * 8 = 32,所以最大带符号的 32 位 int 为:

      0xFFFFFFFF >> 1 # => 2147483647
      

      【讨论】:

      • 这可能会奏效。我希望投反对票的人能给你一个解释。
      • @JoePlante 提问者要求一种方法,他作为人类可以记住数字(如十进制数字)。我不了解你,但是解析十六进制然后移位并不是我心理硬件上的直观操作。如果你打算采用这种方法,你不妨只计算 2^31-1。
      • 我回答的问题是“int32 的最大值是多少?”我确实明白你的观点@MarkAmery,但是记住将这一行输入解释器或打印语句实际上是我记住数字的方式。它也可以作为其他尺寸的通用模式。感谢您对@JoePlante 的支持!
      • 没问题。在 16 位之后,我只是停止了记忆,因为你总是可以查到它。 0xFFFFFFFF >> 1 我觉得在很多情况下都是正确的,因为如果你需要转到 64 位,0xFFFFFFFFFFFFFFFF >> 1 也可以。 0xFFFF >> 1 和 0xFF >> 1 也有效。我不确定这是否适用于带有符号值的语言,但我仍然觉得它是可行的
      【解决方案6】:

      永远不要忘记任何类型的最大值:

      如果它有 32 位,则最大可能值是数字 1 的 32 位:

      十进制结果为 4294967295:

      但是,由于也有负数的表示,所以将 4294967295 除以 2 得到 2147483647。

      因此,一个 32 位整数可以表示 -2147483647 到 2147483647

      【讨论】:

      • 你可以,你知道,只得到 2^31 (这也是它在 ram 中的存储方式——正/负标志位为 1 位,数字为 31 位),这将自动一半。并为数字零减一(在您的情况下,您得到 2147483647.5,而不是 2147483647,因为您没有考虑到这一点)。
      【解决方案7】:

      这很容易记住。在十六进制中,一位是 4 位。因此,对于 unsigned int,将 0x 和 8 fs (0xffffffff) 写入 Python 或 Ruby shell 以获取以 10 为底的值。如果需要带符号的值,请记住最高位用作标志。所以你必须把它排除在外。您只需要记住低 3 位为 1,第 4 位为 0 的数字等于 7,因此将0x7fffffff 写入 Python 或 Ruby shell。你也可以写0x100000000 - 10x80000000 - 1,如果你更容易记住的话。

      【讨论】:

        【解决方案8】:

        你会发现二进制 Int32 的最大值是 1111111111111111111111111111111 但在十个基础上你会发现它是 2147483647 或 2^31-1 或 Int32.MaxValue

        【讨论】:

          【解决方案9】:

          使用 Java 9 的 REPL,jshell

          $ jshell
          |  Welcome to JShell -- Version 9-Debian
          
          jshell> System.out.println(Integer.MAX_VALUE)
          2147483647
          

          【讨论】:

            【解决方案10】:

            在 Python 中尝试:

            >>> int('1' * 31, base=2)
            2147483647
            

            【讨论】:

              【解决方案11】:

              在 C 中,在 #include <stdint.h> 之后使用 INT32_MAX。 在 C++ 中,在 #include <cstdint> 之后使用 INT32_MAX

              INT_MAX 用于平台特定大小或UINT32_MAXUINT_MAX 用于unsigned int。见http://www.cplusplus.com/reference/cstdint/http://www.cplusplus.com/reference/climits/

              sizeof(int)

              【讨论】:

                【解决方案12】:

                一般来说,您可以执行一个反映 Int32 本质的简单操作,用 1 填充所有可用位 - 这是您可以轻松记住的东西。它在大多数语言中的工作方式基本相同,但我以 Python 为例:

                max = 0
                bits = [1] * 31 # Generate a "bit array" filled with 1's
                for bit in bits:
                    max = (max << 1) | bit
                # max is now 2147483647
                

                对于无符号 Int32,将其设为 32 而不是 31 1。

                但是自从贴了一些更冒险的方法,我开始想公式,只是为了好玩......

                公式1(如果没有给出运算符,则连接数字)

                • a = 4
                • b = 8
                • ba/a
                • ab-1
                • ab
                • ab-a-b
                • ab-1

                Python 快速检查

                a = 4
                b = 8
                ab = int('%d%d' % (a, b))
                ba = int('%d%d' % (b, a))
                '%d%d%d%d%d' % (ba/a, ab-1, ab, ab-a-b, ab-1)
                # gives '2147483647'
                

                公式 2

                • x = 48
                • x/2-3
                • x-1
                • x
                • x*3/4
                • x-1

                Python 快速检查

                x = 48
                '%d%d%d%d%d' % (x/2-3, x-1, x, x*3/4, x-1) 
                # gives '2147483647'
                

                【讨论】:

                  【解决方案13】:

                  “如果一个大整数没有被召回,你就召回这个助记符。”

                  现在计算每个单词中的字母。

                  【讨论】:

                    【解决方案14】:
                    max_signed_32_bit_num = 1 << 31 - 1;  // alternatively ~(1 << 31)
                    

                    无论如何编译器都应该优化它。

                    我更喜欢1 &lt;&lt; 31 - 1

                    0x7fffffff 因为你不需要计数fs

                    unsigned( pow( 2, 31 ) ) - 1 因为你不需要&lt;math.h&gt;

                    【讨论】:

                    • 您可以使用下划线来提高某些语言的可读性。据我所知,Java 和 Swift 支持这一点,也许是其他人。 0x7FFF_FFFF
                    【解决方案15】:

                    它是 231 - 1(32 位,1 用于符号)。

                    如果你想要一个近似值,使用 210 = 1024 ≈ 103,所以 231 ≈ 2*10 9。如果您想手动计算一个精确值,请使用平方取幂得到 232 = 2(25) 并除以二。您只需平方五次即可得到 232

                    2*2 = 4
                    4*4 = 16
                    16*16 = 256
                    256*256 = 25*25*100 + 2*250*6 + 36 = 62500 + 3000 + 36 = 65536
                    65536*65536 =65000*65000 + 2*65000*536 + 536*536 =  
                    4225000000 + 130000*536 + (250000 + 3600 + 36*36) =
                    4225000000 + 69680000 + 250000 + 3600 + 1296 =
                    4294967296
                    

                    将其除以 2 并减去 1 得到 2,147,483,647。如果您不需要所有数字,而只想说前三个有效数字,则每个平方步骤的计算都非常容易。

                    【讨论】:

                      猜你喜欢
                      • 2015-05-21
                      • 2011-06-15
                      • 2021-12-25
                      • 2011-05-05
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-02-28
                      相关资源
                      最近更新 更多