11

可能重复:
当您在 C# 中从 short 转换为 byte 时会发生什么?

有人可以解释将值转换为字节时发生的情况,如果它超出了最小/最大字节的范围吗?它似乎是取整数值并将其与 255 取模。我试图理解为什么这不会引发异常的原因。

int i = 5000;
byte b = (byte)i;

Console.WriteLine(b);  // outputs 136
4

5 回答 5

10

5000 表示为 4 个字节(int)(十六进制)

|00|00|13|88|

现在,当您将其转换为字节时,它只需要最后 1 个字节。

原因:在 IL 级别,将使用conv.u1运算符,如果在将 int 转换为 byte 时发生溢出,它将截断高位。(参见conv.u1文档中的备注部分)。

|88|

十进制表示为 136

于 2012-09-24T21:20:37.187 回答
5

正在发生的事情是系统正在丢弃最高有效字节以使其适合。查看这个 StackOverFlow 答案,了解正在发生的事情的一个很好的解释。

于 2012-09-24T21:12:23.190 回答
3

我试图了解为什么这不会引发异常的原因。

因为溢出检查的默认设置是off

试试这个,它会抛出:

checked
{
    int i = 5000;
    byte b = (byte)i;

    Console.WriteLine(b);
}

简短的形式是:

int i = 5000;
byte b = checked ( (byte)i );    
Console.WriteLine(b);
于 2012-09-24T21:17:24.357 回答
1

你得到5000%256 = 136,像往常一样充满。

于 2012-09-24T21:12:40.787 回答
0

MSDN 中也对此进行了说明。如果发生溢出,使用checked()抛出异常。另请阅读: MSDN:第 5 章:关于变量的更多信息

于 2012-09-24T21:16:27.413 回答