1

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

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

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

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

2 回答 2

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。
    • 在未经检查的上下文中,转换始终成功,并按如下方式进行。
      • 如果源类型大于目标类型,则源值通过丢弃其“额外”最高有效位来截断。然后将结果视为目标类型的值。

最后一个子弹正是这里发生的事情。

于 2013-03-03T19:55:32.233 回答
0

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

你甚至期望会发生什么?

于 2013-03-03T19:55:22.507 回答