C# 字节溢出计算为零而不是异常?
C#字节范围是0到255,因此我尝试将int值转换为256到字节,看看会发生什么 令人惊讶的是,它返回的是0而不是255或更好,但是否给我一个溢出异常 更新: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),其中 转换发
我正在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);