【问题标题】:Why unchecked not working on byte? [duplicate]为什么未经检查不能处理字节? [复制]
【发布时间】:2013-09-28 18:17:44
【问题描述】:

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

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

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

例如:

unchecked
{
   int i=2147483647+10;
}

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

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

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

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

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

或者我根本不理解 unchecked 关键字?

【问题讨论】:

  • A byte 最多可容纳 255 个,因此无论如何都不会溢出。你的“编译器错误”是什么?
  • 无法将 int 隐式转换为字节

标签: c#


【解决方案1】:

您误解了unchecked 的用途。它有两个作用:

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

不会改变表达式的类型。 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
}

【讨论】:

  • 看到 Jon Skeet 先生回答我的问题真是难以置信,Thnkkuu 先生
【解决方案2】:

没有+ 对字节的操作。因此,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;

下面的各种想法是对设计的合理近似 考虑因素。 更笼统地说:我不认为字节是“数字”;我 将它们视为可以解释为的位模式 数字、字符、颜色或其他任何东西。如果你要成为 对它们进行数学运算并将它们视为数字,那么这是有道理的 将结果移动到更普遍解释的数据类型中 作为一个数字。

【讨论】:

    猜你喜欢
    • 2019-12-25
    • 2014-06-04
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多