我显式地将我的变量转换为in然后使用加号运算符但仍然返回44我想知道为什么会发生这种情况我将变量显式转换为int。
byte b = 100;
b = (byte)(b +200);
为什么要用这个我的结果是255?
byte b = 100;
b = (byte)(b + 155);
答案 0 :(得分:6)
让我们把它分开:
byte b = 100;
int tmp = (int) b + (int) 200;
b = (byte) b;
现在tmp
的值为300 ......但这不能表示为byte
。当您将其转换为byte
时(在未经检查的上下文中),它将最终为44。
C#5规范的相关部分,第6.2.1节:
显式数字转换可能会丢失信息或可能导致抛出异常。显式数字转换按如下方式处理:
- 对于从整数类型到另一个整数类型的转换,处理取决于发生转换的溢出检查上下文(第7.6.12节):
- 在已检查的上下文中,如果源操作数的值在目标类型的范围内,则转换成功,但如果源操作数的值超出目标类型的范围,则抛出System.OverflowException。 / LI>
- 在未选中的上下文中,转换始终成功,并按如下方式进行。
- 如果源类型大于目标类型,则通过丢弃其“额外”最高有效位来截断源值。然后将结果视为目标类型的值。
最后一颗子弹正是这里发生的事情。
答案 1 :(得分:0)
因为“100 + 200”的结果是300. 300不能放入一个字节(你把它投射到),所以更高的位被丢弃 - 留下44。
你甚至期望发生什么?