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

1 c#

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

byte b = 100;
b = (byte)(b +200);
Run Code Online (Sandbox Code Playgroud)

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

byte b = 100;
b = (byte)(b + 155);
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 6

让我们分开吧:

byte b = 100;
int tmp = (int) b + (int) 200;
b = (byte) b;
Run Code Online (Sandbox Code Playgroud)

现在tmp将具有300的值......但这不能表示为byte.当你将它投射到byte(在未经检查的上下文中)时,它将最终为44.

C#5规范的相关部分,第6.2.1节:

显式数字转换可能会丢失信息或可能导致抛出异常.显式数字转换按如下方式处理:

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

最后一颗子弹正是这里发生的事情.