c# - 为什么以不同的方式添加字节会产生不同的结果?
问题描述
谁能向我解释一下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();
解决方案
这一行:
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
可隐式转换x
为x = (T)(x op y)
,其中T
是 的类型x
,除了x
只计算一次。- 否则,复合赋值无效,并发生绑定时错误。
推荐阅读
- javascript - 如何创建 Promisify 包装器方法?
- c# - 无法将图像转换为字节数组
- excel - Excel 单元格突然不可见
- python - 定义函数的全局行为?好习惯
- java - 如何使用 JDBC 在 spring-session 中初始化模式
- c# - 如何使用带有 c# nuget 包的自定义分支对 TFS 构建进行排队?
- python - 如何在 Python、Flask 中的服务器启动/重启时从 .env 文件中导出并确保变量的可用性?
- docker - docker - 如何确定哪个挂载属于哪个映像?
- datatables - 消除 DataTables.net 中的重复行
- css - 用于重复闪烁效果的 CSS 关键帧(wifi)