为什么不选中不工作的字节?

时间:2013-09-28 10:00:30

标签: c#

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

  

unchecked关键字用于抑制溢出检查   积分型算术运算和转换。在一个未经检查   context,如果表达式产生的值超出范围   如果是目标类型,则不会标记溢出。

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

例如:

unchecked
{
   int i=2147483647+10;
}

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

但是当我们在字节上应用它时它不起作用

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

因此,应该抑制在未经检查的环境中编写的任何内容。

为什么会出现编译时错误?

或者我根本不理解未经检查的关键字?

2 个答案:

答案 0 :(得分:9)

你误解了unchecked的目的。它有两个影响:

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

更改表达式的类型。 type of the expression b1 + b2 is still int,因此您仍然需要强制转换才能将其转换为byte。在这种情况下,checkedunchecked之间的区别在于将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
}

答案 1 :(得分: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关键字用于整数类型算术的溢出检查,而Eric Lippert says ;

  

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