我目前正在阅读C#4.0在A Nutshell中,在第2章中它指出如果一个int对象的值为int.MinValue
(-2147483648)并且值减小了,因为该值不能任何更低,它会达到最高值,int.MaxValue
(2147483647):
int a = int.MinValue;
Console.WriteLine(a); //-2147483648
a = a-1;
Console.WriteLine(a); //-2147483648
Console.WriteLine (a == int.MaxValue); // True
然后,本书继续提及如何使用checked
来防止这种情况发生。
然而,我想知道为什么这是可能的?如果不受checked
这不是设计中的一个缺陷吗?为什么有人希望最小值成为最大值?
此外,我注意到VB.NET会抛出“算术溢出”而不是让这种情况发生:
Dim a As Integer
a = Integer.MaxValue
a = a + 1
Response.Write(a) 'Arithmetic overflow exception here
答案 0 :(得分:1)
这是语言设计的问题 - 为什么会发生这种情况与数字的二进制表示有关。在.NET中,这是用two's complement完成的,因此存在溢出问题。
VB.NET的设计者决定不允许出现这样的溢出/下溢问题。
C#的设计者决定将控制权交给程序员。
答案 1 :(得分:1)
有时这是理想的行为。其他时候,它没有必要处理和检查溢出,因为它们会减慢程序执行速度。拍摄未绑定的游戏(FPS)。在1000FPS时,小的1ms额外检查可能对帧速率产生重大影响。其他时候,它可能是预期的执行(我迄今只看到过这种情况的一种用法) - 它从C#的祖先 - C ++和C中发生的事情开始流传。
另请注意,默认行为(checked
或unchecked
)因配置和环境而异:
如果既未使用也未取消选中,则使用常量表达式 编译时的默认溢出检查,检查。 否则,如果表达式是非常量的,则运行时溢出 检查取决于其他因素,如编译器选项和 环境配置。
由于您发布的代码是非常量的(并且还由于各种环境变量),因此不会检查溢出。
答案 2 :(得分:1)
您的程序可能会自动检查溢出:右键单击项目文件, 选择Build,然后选择右下角的Advanced按钮。在打开的窗口中,选中Check Arithmetical Overflow checkbutton。