C# 将转换为int的两个字节的变量求和

C# 将转换为int的两个字节的变量求和,c#,C#,我将变量显式转换为in,然后使用加号运算符,但仍然返回44。我想知道为什么会发生这种情况,我将变量显式转换为int byte b = 100; b = (byte)(b +200); 为什么用这个我的结果是255 byte b = 100; b = (byte)(b + 155); 因为“100+200”的结果是300。300不能装入一个字节(您将其转换为),因此较高的位会被丢弃,剩下44位 你期望会发生什么?因为“100+200”的结果是300。300不能装入一个字节(您将其转换为),因此

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

byte b = 100;
b = (byte)(b +200);
为什么用这个我的结果是255

byte b = 100;
b = (byte)(b + 155);
因为“100+200”的结果是300。300不能装入一个字节(您将其转换为),因此较高的位会被丢弃,剩下44位

你期望会发生什么?

因为“100+200”的结果是300。300不能装入一个字节(您将其转换为),因此较高的位会被丢弃,剩下44位

你到底期望发生什么呢?

让我们把它分开:

byte b = 100;
int tmp = (int) b + (int) 200;
b = (byte) b;
现在
tmp
的值为300。。。但这不能表示为
字节。当您将其强制转换为
字节时(在未选中的上下文中),它将以44结尾

C#5规范第6.2.1节的相关位:

显式数字转换可能会丢失信息或引发异常。显式数字转换的处理如下所示:

  • 对于从一个整数类型到另一个整数类型的转换,处理取决于转换发生的溢出检查上下文(§7.6.12):
    • 在选中的上下文中,如果源操作数的值在目标类型的范围内,则转换成功,但如果源操作数的值在目标类型的范围外,则抛出System.OverflowException
    • 在未检查的上下文中,转换始终成功,并按如下方式进行。
      • 如果源类型大于目标类型,则通过丢弃其“额外”最高有效位来截断源值。然后将结果视为目标类型的值
最后一颗子弹正是这里发生的事情。

让我们把它分开:

byte b = 100;
int tmp = (int) b + (int) 200;
b = (byte) b;
现在
tmp
的值为300。。。但这不能表示为
字节。当您将其强制转换为
字节时(在未选中的上下文中),它将以44结尾

C#5规范第6.2.1节的相关位:

显式数字转换可能会丢失信息或引发异常。显式数字转换的处理如下所示:

  • 对于从一个整数类型到另一个整数类型的转换,处理取决于转换发生的溢出检查上下文(§7.6.12):
    • 在选中的上下文中,如果源操作数的值在目标类型的范围内,则转换成功,但如果源操作数的值在目标类型的范围外,则抛出System.OverflowException
    • 在未检查的上下文中,转换始终成功,并按如下方式进行。
      • 如果源类型大于目标类型,则通过丢弃其“额外”最高有效位来截断源值。然后将结果视为目标类型的值

最后一颗子弹就是这里发生的事情。

你会得到溢出。如果字节值300-256=44,则会出现溢出。300-256的字节值=44