【问题标题】:Why does this integer overflow occur?为什么会发生这种整数溢出?
【发布时间】:2009-02-23 15:26:15
【问题描述】:

我已经包装了一个 dll 方法,该方法具有一个整数作为 Web 服务中的输出参数。 在测试中,我发现当我期待 -1 时,我得到了 65,535。我意识到 dll 使用的是 16 位整数,并且在我的代码中引用外部 dll 时我指定了标准的 .NET 32 位整数。通过指定一个 16 位整数很快解决了这个问题,一切都很好。

我的问题是为什么会发生这种情况?如果我试图将 32 位整数放入 16 位整数中,我可以理解发生溢出,但我不太确定为什么会反过来发生这种情况。显然,我对类型之间的这种类型转换的理解有点缺乏,所以任何指导将不胜感激。

【问题讨论】:

    标签: .net integer-overflow


    【解决方案1】:

    16 位整数“-1”设置了所有 16 位。如果设置 32 位整数的低 16 位,则值为 65,535。有关负整数的内部表示的解释,请查看 this article

    【讨论】:

    • @Paul - 感谢您的解释和链接。他们一起很好地解释了它。
    【解决方案2】:

    这是因为类型转换而发生的。

    您实际上并没有在调用堆栈上发送 16 位整数——它们仍然是 32 位的。所以 DLL 返回的确切是:

    0x0000ffff
    

    如果您将其转换为例如sint16,这是-1,但是如果这是32位,这是65535

    【讨论】:

      猜你喜欢
      • 2011-06-20
      • 2017-09-04
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多