在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章:有关变量的更多信息