对转换为int的两个字节变量求和

时间:2013-03-03 19:53:22

标签: c#

我显式地将我的变量转换为in然后使用加号运算符但仍然返回44我想知道为什么会发生这种情况我将变量显式转换为int。

byte b = 100;
b = (byte)(b +200);

为什么要用这个我的结果是255?

byte b = 100;
b = (byte)(b + 155);

2 个答案:

答案 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。

你甚至期望发生什么?