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

C# 字节溢出计算为零而不是异常?,c#,.net,C#,.net,C#字节范围是0到255,因此我尝试将int值转换为256到字节,看看会发生什么 令人惊讶的是,它返回的是0而不是255或更好,但是否给我一个溢出异常 更新: 我正在macos上试用它,它是Mono,如果有必要的话。NETFramework4.7就是预期的行为。仔细想想,256是一个“1”,在二进制中后跟8个零。当去掉除最低有效8位以外的所有值时,得到8个零,即值0 根据C#语言规范§6.2.1: 对于从一个整数类型到另一个整数类型的转换 处理取决于溢出检查上下文(§7.6.12),其中 转换发

C#字节范围是0到255,因此我尝试将int值转换为256到字节,看看会发生什么

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

更新:
我正在macos上试用它,它是Mono,如果有必要的话。NETFramework4.7就是预期的行为。仔细想想,256是一个“1”,在二进制中后跟8个零。当去掉除最低有效8位以外的所有值时,得到8个零,即值0

根据C#语言规范§6.2.1:

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

  • 在选中的
    上下文中,如果源操作数的值在目标类型的范围内,但抛出
    如果源操作数的值为
    超出目标类型的范围
  • 在未选中的
    上下文中,转换始终成功,并按如下方式进行。
    
    • 如果源类型大于目标类型,则通过丢弃其“额外”最重要值来截断源值 位。然后将结果视为目标类型的值
如果需要异常,可以使用
选中的

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

我想补充前面的答案

看看这个:

255->11111111+

001->00000001

256->100000000

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


这更多的是理论,而不是具体的问题。但我认为理解这一点很重要。

256二进制是1 0000 0000,一个字节只包含8位,因此当您将256转换为字节时,左侧的1将被忽略!但这是否也意味着,为了在处理数字时获得绝对可预测的结果,建议在每次算术运算中检查
?或类型转换?如果您总是希望在发生溢出时出现异常,则应在可能发生溢出时选中
。但有时“环绕”可能是首选@我很好奇,因为这涉及到另一个额外的检查,它会不会影响系统的性能?还是可以忽略?@Isaac它确实添加了一个额外的检查,但实际上,您应该只在实际存在性能问题时才处理这些问题,并且您确定这是由
检查的
语句引起的,而不是其他一些不太可能的代码。如果您希望它总是引发异常,您可以在.csproj文件中添加
-checked
编译器选项,它将是
true
b = checked((byte) n);