【问题标题】:Sum tow byte variable that casting to int将转换为 int 的两个字节变量相加
【发布时间】:2013-03-03 19:53:22
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你得到一个溢出。字节值 300-256 = 44

标签: c#


【解决方案1】:

让我们分开:

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

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

【讨论】:

    【解决方案2】:

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

    你甚至期望会发生什么?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      • 1970-01-01
      • 2016-03-04
      • 2016-02-20
      相关资源
      最近更新 更多