在C#中转换为字节

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

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

int i = 5000; byte b = (byte)i; Console.WriteLine(b); // outputs 136 

5000表示为4个字节(int)(hex)

| 00 | 00 | 13 | 88 |

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

原因:在IL级别,将使用conv.u1运算符,如果将int转换为byte,则会截断高位。 (请参阅conv.u1文档中的备注部分)。

| 88 |

十进制表示为136

发生了什么事情是系统正在丢弃最重要的字节以使其适合。 看看这个StackOverFlow答案 ,可以很好地解释发生了什么。

我试图理解为什么这不会引发exception的原因。

因为溢出检查的默认设置已关闭

试试这个,它会抛出:

 checked { int i = 5000; byte b = (byte)i; Console.WriteLine(b); } 

简短forms是:

 int i = 5000; byte b = checked ( (byte)i ); Console.WriteLine(b); 

你得到5000%256 = 136 ,就像总是满满的一样。

它也在MSDN中解释。 如果发生溢出,请使用checked()抛出exception。 另请阅读: MSDN:第5章:有关变量的更多信息