首页 > 解决方案 > 为什么以不同的方式添加字节会产生不同的结果?

问题描述

谁能向我解释一下Console.WriteLine(a);这个代码块中的输出如何等于 44。

byte a = 200;
byte b = 100;
var c = a + b;
Console.WriteLine(c.GetType());  // output: System.Int32
Console.WriteLine(c);  // output: 300

a += b;
Console.WriteLine(a.GetType());
Console.WriteLine(a);  // output: 44
Console.ReadLine();

标签: c#

解决方案


这一行:

a += b;

相当于这一行:

a = (byte) (a + b);

...除了a只评估一次。的结果a + b是类型的int(在这种情况下值为 300),并且强制转换为将其byte截断为 8 位(byte类型的大小),留下 44 的结果。

从 ECMA C# 5 标准的第 12.18.3 节:

通过应用二元运算符重载决议(第 12.4.5 节)来处理表单的操作,x op= y就好像该操作是编写的一样x op y。然后,

  • 如果所选运算符的返回类型可隐式转换为 x 的类型,则运算的计算结果为x = x op y,但x只计算一次。
  • 否则,如果所选运算符是预定义运算符,如果所选运算符的返回类型可显式转换为 的类型x,并且如果y可隐式转换xx = (T)(x op y),其中T是 的类型x,除了x只计算一次。
  • 否则,复合赋值无效,并发生绑定时错误。

推荐阅读