【发布时间】:2014-04-23 09:10:16
【问题描述】:
我们在客户机器上的以下行中得到 ArithmeticException(算术运算中溢出或下溢。)。我们无法在任何 PC(客户或我们的)上复制它:
var actualFullness = (byte)((hdd.Capacity - hdd.FreeSpace) / (float)hdd.Capacity * 100);
其中hdd.Capacity 和hdd.FreeSpace 是uint。值来自本机 DLL 中的函数。
我们在程序中使用 NO checked 或 unchecked 关键字。我们不使用 /checked 编译器选项。
它是用 .NET 4 编写的,并且作为 32 位进程运行。
知道为什么会抛出这个异常吗?
【问题讨论】:
-
uint/float 你把它转换成字节?
-
在执行算术运算之前,您是否记录了
Capacity和FreeSpace的值?这将有助于诊断。 -
有没有可能你的容量小于可用空间(无论什么原因),然后会导致负值
-
为什么要使用另一个 DLL 来获取这些信息? WMI(例如来自
Win32_LogicalDricve)。值得注意的是,WMI 中的 FreeSpace 和 Capacity 值为uint64。超过 4GB 的分区会导致该表达式出现溢出问题。 -
虽然这似乎是一个非常有趣的问题,但我投票以“缺乏足够的信息”为由结束这个问题,仅仅是因为这里有太多的未知数,任何人都无法得出结论性的答案。 DLL 的输出是什么?我们在谈论什么单位?抛出此异常的硬盘驱动器的容量和可用空间值是多少?容量和可用空间值是否准确(意味着您从 DLL 获得的值与 WMI 告诉您的一致)?
标签: c# .net-4.0 checked unchecked arithmeticexception