【问题标题】:Why can't I pass a large value as an Int32?为什么我不能将较大的值作为 Int32 传递?
【发布时间】:2011-09-09 09:08:59
【问题描述】:

我有一个号码:94,800,620,800

Float 是 4 字节数据类型。 Int32 也是 4 字节数据类型。

float f = 94800620800; // ok
Int32 t = 94800620800; // error

请解释一下这个问题。为什么在使用 Int32 时出现错误。为什么我可以将此数字用于浮点数据类型,因为它们都是 4 字节数据类型。谢谢。

【问题讨论】:

标签: c# floating-point int32


【解决方案1】:

因为您尝试分配的数字大于 largest possible value 类型的数字 Int32,恰好是 2,147,483,647。请注意,Single 的最大值为 3.402823 × 1038

【讨论】:

  • 因为用于从以字节存储的数据计算所需数字的内部机制,例如与整数相乘和与实数求幂。
  • 不,您尝试传递的值是 5 个字节 - 0x16128EAD00
【解决方案2】:

Int32 的最大值为 2,147,483,647 - 小于 94,800,620,800。

浮点数可以取以下范围内的值:±1.5 × 10−45 到 ±3.4 × 1038

另外,请查看这个 SO 问题 - what the difference between the float and integer data type when the size is same in java?。这是一个 Java 问题,但概念是相同的,并且对差异有详细的解释,即使它们的大小相同。

【讨论】:

    【解决方案3】:

    因为这个数字对于 4 字节的 int 来说太大了。像Int32 这样的标量值有一个最小和最大限制(在这种情况下分别为 -231 和 231 - 1),你根本不能存储此范围之外的值。

    浮点数的存储方式完全不同,因此您不会遇到大值的编译器错误,只会在以后的运行时出现精度问题。

    【讨论】:

      【解决方案4】:

      因为这些类型的内部表示。

      float 使用类似 i,d ^ n 的东西,其中 i 是整数部分,d 是小数部分,n 是指数(当然,这发生在以 2 为底的情况下)。

      通过这种方式,您可以在float 中存储更大的数字,但在存储整数时它不会像Int32 那样准确。如果你尝试转换

      float f = 94800620800; 
      

      对于一个大到足以存储其值的整数类型,它可能与初始的94800620800不同。

      【讨论】:

        【解决方案5】:

        整数类型是精确表示,而浮点数是有效数字和指数的组合。

        floating point wiki page 正在解释这是如何工作的。

        【讨论】:

          【解决方案6】:

          也许您应该阅读错误消息? ;)

          Error   Integral constant is too large
          

          32 位 int 的最大值为 2,147,483,647

          另一方面,浮点数之所以有效,是因为它存储了尾数和指数,而不仅仅是一个数字,因此它可以处理更大的范围,但可能会损失精度

          尝试打印你的浮点数,你会得到94800620000而不是94800620800,因为低位丢失了

          【讨论】:

            【解决方案7】:

            Int32 的最大值为 2,147,483,647。你的价值要高得多。

            看看system.int32.maxvalue

            【讨论】:

              【解决方案8】:

              提供的常量表达式的值不在 int 数据类型的范围内。

              【讨论】:

                【解决方案9】:

                Int32 的范围从 − 2,147,483,648 到 2,147,483,647。您的变量超出范围。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-08-16
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多