4

我的问题是关于 C# 控制台编程中的这段代码,我用一个例子问它:

这段代码是不可能的:

byte sum = (byte)(150 + 150); //impossible

但这段代码是可能的:

byte sum = unchecked((byte)(150 + 150)); //possible

我的问题是:如何unchecked工作?我的意思是如何UNCHECKED使这段代码成为可能?

4

2 回答 2

7

所有未经检查的意思是如果值溢出(越过边界MaxValueMinValue边界),则不会引发错误并且它允许发生回绕。

byte.MaxValue255150 + 150300。_ 通过允许溢出,它越过255边界并从byte.MinValue(0在这种情况下) 再次开始计数,以达到44( (150 + 150) - 256 = 44)的最终值

于 2013-08-05T20:31:35.967 回答
3

溢出可以在编译时检测到,因为表达式的所有项都是常量。

如果您将其替换为

int i = 150;
byte sum = (byte)(i + i);

它会编译得很好。

通过使用unchecked,您就是suppressing overflow-checking.

即使这样也不会编译 -

const int i = 150;
byte sum = (byte)(i + i);

因为constkeyowrd 的使用使得它在编译时可用。

于 2013-08-05T20:33:44.570 回答