【问题标题】:Multiplication issue with Visual Studio debugger for C#C# 的 Visual Studio 调试器的乘法问题
【发布时间】:2011-03-09 14:37:53
【问题描述】:

如果我在 C# 调试器的监视窗口中输入 174 * 256 * 256 * 256,结果是
-1375731712。我认为它与 256 有关,但我希望能得到一些指导。

谢谢!!

【问题讨论】:

  • 整数溢出导致。
  • 我认为这与整数溢出有关。不要引用我的话,但监视窗口的默认整数类型可能是 32 位。由于这个限制,乘法超过最大值并最终溢出到负数。
  • @invalidsyntax:这不是窗口的默认值,而是语言的默认值。未修饰的整数文字在 C# 中被解释为 Int32。
  • @Eric Mickelsen -- 感谢您的澄清。
  • 那么你们的意思是这是一个整数溢出? :-)

标签: c# visual-studio overflow unchecked


【解决方案1】:

不,与 256 无关。只是乘法的结果大于最大可能的有符号 32 位整数,所以出现了溢出。

试试这个:

174L * 256L * 256L * 256L

这些是 64 位整数文字。

【讨论】:

  • 有趣。为什么没有抛出异常?
  • @Mike C.:整数乘法是处理器级指令,速度极快。对于这样的低级操作,检查溢出将非常昂贵。具有任意大小或任意精度的数学需要没有固定大小的数据类型,通常称为“大”。
  • @Mike C:如果您希望整数算术在您的 C# 程序中引发溢出异常,那么 (1) "x = checked(ab);", (2) "checked { x = ab; },或 (3) 编译器上有一个“make checked the default”开关。类似地,有一个“unchecked”强制相反的行为。
【解决方案2】:

它会发生unchecked 溢出(因此溢出而没有错误)。像这样思考:Int32.MaxValue + 1 == Int32.MinValue,但需要乘法。

这解释了 int 如何在内存中表示 http://en.wikipedia.org/wiki/Two's_complement

【讨论】:

    【解决方案3】:

    试着输入这个:

    174 * 256 * 256 * 256f
    

    所以结果不会被转换为整数而是浮点数。

    【讨论】:

      【解决方案4】:

      您正面临整数溢出。如果您想不受限制地处理大数字(当然除了可用内存),您可以使用System.Numerics.BigInteger。在您的特殊情况下,long 也可以(64 位整数)

      【讨论】:

        【解决方案5】:

        您正在溢出整数。真正的答案是 2,919,235,584,但最多只能将 2,147,483,647 表示为有符号整数。考虑一个 unsigned int (uint)、一个 long、一个 ulong,或者如果它不够大。对于监视窗口,您可能必须转换第一个参数或使用后缀,例如174L * 256L * 256L * 256L

        【讨论】:

          【解决方案6】:

          这是一个简单的溢出。尝试在您的监视窗口中输入:

          (uint)(174 * 256 * 256 * 256)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-02-04
            • 1970-01-01
            • 2020-12-20
            • 1970-01-01
            • 1970-01-01
            • 2011-03-04
            相关资源
            最近更新 更多