3

unchecked关键字已在 MSDN 库中解释为:

unchecked 关键字用于抑制整数类型算术运算和转换的溢出检查。在未经检查的上下文中,如果表达式产生的值超出目标类型的范围,则不会标记溢出。

根据定义,它适用于int类型。

例如:

unchecked
{
   int i=2147483647+10;
}

在这里它抑制了未经检查的块内的溢出。(应该是)

但是当我们将它应用于字节时它不起作用

byte b1=100,b2=100,b3;
unchecked
{
   b3=b1+b2;//error here
}

因此,在未经检查的环境中编写的任何内容都应该被禁止。

为什么它给出编译时错误?

还是我根本不理解 unchecked 关键字?

4

2 回答 2

9

你误解了unchecked. 它有两个作用:

  • 它可以防止在执行时进行溢出检查
  • 根据您的第一个示例,它允许您转换超出类型正常范围的常量值。

不会改变表达式的类型。表达式b1 + b2int的类型仍然是,因此您仍然需要进行强制转换才能将其转换为bytechecked和在这种情况下的区别在于unchecked执行时处理溢出时的int回退到byte

byte b1 = 255, b2 = 1;
unchecked
{
   byte b3 = (byte) (b1 + b2);
   // b3 is now 0
}

使用检查算术:

byte b1 = 255, b2 = 1;
checked
{
   byte b3 = (byte) (b1 + b2); // OverflowException
}
于 2013-09-28T10:04:30.177 回答
4

没有+对字节的操作。所以,b1 + b2还是int这样的结果。

你的代码就像这样工作;

byte b1 = 100, b2 = 100, b3;
unchecked
{
   b3 = (int)b1 + (int)b2; //error here
}

如果你投到byte解决方案,就不会有问题;

byte b1 = 100, b2 = 100, b3;
unchecked
{
    b3 = (byte)(b1 + b2); //There is no error here.
}

为什么未经检查不能处理字节?

因为unchecked关键字 is 用于整数类型算术的溢出检查,Eric Lippert

下面的各种思考是对设计考虑的合理近似。更一般地说:我不认为字节是“数字”;我认为它们是可以解释为数字、字符、颜色或其他任何东西的位模式。如果您要对它们进行数学运算并将它们视为数字,那么将结果移动到更通常被解释为数字的数据类型是有意义的。

于 2013-09-28T10:06:08.667 回答