字节溢出求值为零而不是异常?

时间:2019-03-16 08:07:57

标签: c# .net

static void Main(string[] args)
{
  int n;
  byte b;
  n = 256;
  b = (byte) n;
  Console.WriteLine(b); //0
}

C#字节范围是0到255,因此我尝试将256的整数转换为字节,然后看看会发生什么。

令人惊讶的是,它返回0而不是255或更好,但给我一个溢出异常?

更新: 我正在macOS上试用它,如果它很重要,请使用.NET Framework 4.7

2 个答案:

答案 0 :(得分:6)

这是预期的行为。如果考虑一下,则256是一个“ 1”,后跟二进制的8个零。当除去除最低有效8位之外的所有内容时,您将获得8个零,即0。

根据C#语言规范§6.2.1:

  

要从整数类型转换为另一个整数类型,   处理取决于溢出检查上下文(第7.6.12节),其中   转换发生:

     
      
  • checked上下文中,如果源操作数的值在目标类型的范围内,则转换成功,但将引发   System.OverflowException,如果源操作数的值为   超出目标类型的范围。
  •   
  • unchecked上下文中,转换始终成功,并按如下进行。      
        
    • 如果源类型大于目标类型,那么将通过舍弃其最重要的“额外”来截断源值   位。然后将结果视为目标类型的值。
    •   
  •   

如果要例外,可以使用checked

b = checked((byte) n);

答案 1 :(得分:2)

我想补充前面的答案。

看看这个:

255-> 11111111 +

001-> 00000001

256-> 1 00000000

如您所见。我们有256个二进制格式,但是由于您的数字是8位,因此无法存储 1 。留下数字00000000,它是零。

这比C#特定问题更具理论性。但是我认为这很重要。