unchecked
关键字已在MSDN库中解释为:
unchecked关键字用于抑制溢出检查 积分型算术运算和转换。在一个未经检查 context,如果表达式产生的值超出范围 如果是目标类型,则不会标记溢出。
根据定义,它适用于int
类型。
例如:
unchecked
{
int i=2147483647+10;
}
这里它抑制了未经检查的块内的溢出。(它应该是)
但是当我们在字节上应用它时它不起作用
byte b1=100,b2=100,b3;
unchecked
{
b3=b1+b2;//error here
}
因此,应该抑制在未经检查的环境中编写的任何内容。
为什么会出现编译时错误?
或者我根本不理解未经检查的关键字?
答案 0 :(得分:9)
你误解了unchecked
的目的。它有两个影响:
不更改表达式的类型。 type of the expression b1 + b2
is still int
,因此您仍然需要强制转换才能将其转换为byte
。在这种情况下,checked
和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
}
答案 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 ;
下面的各种思考是设计的合理近似 注意事项。 更一般地说:我认为字节不是“数字”;一世 将它们视为可以解释为的位模式 数字,字符,颜色或其他。如果你要成为 对它们进行数学运算并将它们视为数字,那么它就有意义了 将结果移动到更常被解释的数据类型 作为一个数字。