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
答案 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#特定问题更具理论性。但是我认为这很重要。