减小minimum int的值会导致最大int

时间:2011-08-09 08:33:22

标签: c# c#-4.0 int

我目前正在阅读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

3 个答案:

答案 0 :(得分:1)

这是语言设计的问题 - 为什么会发生这种情况与数字的二进制表示有关。在.NET中,这是用two's complement完成的,因此存在溢出问题。

VB.NET的设计者决定不允许出现这样的溢出/下溢问题。

C#的设计者决定将控制权交给程序员。

答案 1 :(得分:1)

有时这是理想的行为。其他时候,它没有必要处理和检查溢出,因为它们会减慢程序执行速度。拍摄未绑定的游戏(FPS)。在1000FPS时,小的1ms额外检查可能对帧速率产生重大影响。其他时候,它可能是预期的执行(我迄今只看到过这种情况的一种用法) - 它从C#的祖先 - C ++和C中发生的事情开始流传。

另请注意,默认行为(checkedunchecked)因配置和环境而异:

  

如果既未使用也未取消选中,则使用常量表达式   编译时的默认溢出检查,检查。   否则,如果表达式是非常量的,则运行时溢出   检查取决于其他因素,如编译器选项和   环境配置。

由于您发布的代码是非常量的(并且还由于各种环境变量),因此不会检查溢出。

答案 2 :(得分:1)

您的程序可能会自动检查溢出:右键单击项目文件, 选择Build,然后选择右下角的Advanced按钮。在打开的窗口中,选中Check Arithmetical Overflow checkbutton。