代码之家  ›  专栏  ›  技术社区  ›  Isaac

字节溢出计算为零而不是异常?

  •  1
  • Isaac  · 技术社区  · 5 年前
    static void Main(string[] args)
    {
      int n;
      byte b;
      n = 256;
      b = (byte) n;
      Console.WriteLine(b); //0
    }
    

    更新: 如果有必要的话,我会在macos上尝试,macos是Mono,而.NETFramework是4.7

    1 回复  |  直到 5 年前
        1
  •  6
  •   Sweeper    5 年前

    这是预期的行为。仔细想想,256是一个“1”,后跟8个二进制零。当去掉除最低有效8位以外的所有值时,得到8个零,即值0。

    对于从一个整数类型到另一个整数类型的转换 处理取决于溢出检查上下文(§7.6.12)其中 转换发生在:

    • checked 如果源操作数的值在目标类型的范围内,但抛出 System.OverflowException 如果源操作数的值为
    • 在一个 unchecked 在上下文中,转换总是成功的,并按如下方式进行。
      • 如果源类型大于目标类型,则通过丢弃其额外的最重要值来截断源值

    如果需要异常,可以使用 选中的

    b = checked((byte) n);
    
        2
  •  2
  •   Jordan Motta    5 年前

    我想补充前面的回答。

    看看这个:

    256-> 1 00000000

    如你所见。我们有256位二进制格式,但是你的数字是8位, 1 无法存储。这就留下了00000000这个数字,它是零。

    这不仅仅是一个具体问题,更是一种理论。但我认为理解这一点很重要。