【发布时间】:2011-06-20 06:44:20
【问题描述】:
在这个问题中,主题是如何让 VS 检查 C# 中的算术溢出并抛出异常:C# Overflow not Working? How to enable Overflow Checking?
其中一位 cmets 说了一些奇怪的事情并得到了很多人的支持,我希望你能在这里帮助我:
您还可以使用 checked 关键字来包装一个语句或一组语句,以便显式检查它们是否存在算术溢出。设置项目范围的属性有点冒险,因为溢出通常是一个相当合理的预期。
我对硬件了解不多,但我知道溢出与寄存器的工作方式有关。我一直认为溢出会导致未定义的行为,应尽可能防止。 (在“正常”项目中,不编写恶意代码)
为什么您会期望发生溢出?如果有可能,为什么不总是阻止它? (通过设置相应的编译选项)
【问题讨论】:
-
您的陈述“溢出导致未定义的行为”是不正确的......它的定义非常明确,尤其是在整数的情况下。在这种情况下,您的陈述“我对硬件知之甚少”说明了...您应该阅读一些有关二进制以及加法在机器级别的工作原理的内容
-
这句话可能来自 C/C++ 的思维方式,溢出是一种“未定义的行为”,这意味着编译器编写者在优化时可以做你不期望的事情。 CPU 确实具有明确定义的行为并不重要,编译器编写器使用 bignum 常量表达式评估优化器,可能会检测到它并消除代码“它不是 C/C++ 程序,所以我可以破坏它”。我想,在 C# 中没有人需要关心,因为随着新硬件的不同,MS 已经转向了一些新的灵丹妙药
-
在 C 和 C++ 中,对于无符号整数,溢出是非常明确的行为,但对于有符号整数,确实是未定义的行为。
标签: c# .net overflow integer-overflow