【问题标题】:Why is a cast required for byte subtraction in C#? [duplicate]为什么 C# 中的字节减法需要强制转换? [复制]
【发布时间】:2010-10-29 23:15:02
【问题描述】:

我必须在 VS2008 .net 3.5 中使用 WinForms 来跟踪代码:

byte percent = 70;
byte zero = 0;

Bitmap copy = (Bitmap)image1.Clone();
...

Color oColor = copy.GetPixel(x, y);
byte oR = (byte)(oColor.R - percent < zero ? zero : oColor.R - percent);

当我离开最后一行代码的“(byte)”时,我收到一个编译器错误,提示“无法将类型'int'隐式转换为'byte'。 "如果一切都是byte 类型,而byte 是整数类型...那我为什么需要强制转换?

【问题讨论】:

  • Eric Lippert 说,“我不认为字节是“数字”;我认为它们是可以解释为数字或字符的位模式, “见stackoverflow.com/questions/941584/byte-byte-int-why-c
  • 你们确实意识到你已经将它标记为重复,即使它被问之前“这里已经有答案”链接?
  • 见鬼,现在它甚至说“以前问过”,尽管另一个问题是在三年后问的。
  • 呃,实际上,每个数据值都是一个位模式,可以解释为一个数字。

标签: c# .net casting integer byte


【解决方案1】:

尝试运行以下 C# 代码: 对象o =(字节)(1); o = (int)o; 你能指望什么?现在试试:)

我认为这是正确的:

Eric Lippert 说:“我不认为字节是“数字”;我认为它们是可以解释为数字、字符、颜色或其他内容的位模式。如果你要对它们进行数学运算并将它们视为数字,然后将结果转换为更常被解释为数字的数据类型是有意义的。”

也许 byte 更接近 char 而不是 int。

【讨论】:

  • 您可以对 short、int 和 long 使用相同的逻辑。它们也是可以解释为数字的位串。
  • 试着告诉那些记得 8 位计算的人。除了 sbyte,没有比 byte 更常被解释为数字的 8 位结构了。
【解决方案2】:

FWIW,java 也将字节提升为 int。

【讨论】:

    【解决方案3】:

    因为对 sbyte、byte、ushort 和 short 的算术运算会自动转换为 int。最合理的原因是这样的操作很可能上溢或下溢。

    因此,在您的三元运算中,最终的 oColor.R - percent 实际上会产生一个 int,而不是一个字节。所以操作的返回类型是int。

    【讨论】:

      【解决方案4】:

      因为赋值运算符右侧的算术表达式默认计算为 int。在您的示例中,percent 默认为 int。您可以在MSDN page 上阅读更多相关信息。

      【讨论】:

        【解决方案5】:

        这是因为byte 减法返回一个int。实际上,bytes 上的任何二进制算术运算都将返回 int,因此需要强制转换。

        【讨论】:

        • 我认为这是减法,实际上......
        • 糟糕 - 谢谢查理,我更正了。
        • 投反对票有原因吗?
        • 至少不是我。我想我们有一个随机的否决者,我也有一个。
        【解决方案6】:

        那是因为字节减法的结果不适合一个字节:

        byte - byte = (0..255) - (0..255) = -255..255
        

        【讨论】:

        • 多么漂亮的图形解释!!!
        • 除浮点数或小数外,其他任何整数类型都没有。 int 也是有限范围的,所以 (min_int - max_int) 不适合,但它返回一个 int。
        • @Adam: 1) 浮点数和小数不是整数类型。 2)这些减法的结果也可能不合适,因为它们也有一个有限(尽管很大)的范围。
        【解决方案7】:

        因为减法强制转换为整数。我记得,字节是 C# 中的无符号类型,因此减法可以带您脱离字节域。

        【讨论】:

        • 减法可以把你带出每个数字类型的领域。这并不能真正解释为什么没有特定于字节的减法运算符。
        • 那么,答案是“因为 C# 的开发人员决定他们不想要一个。”
        【解决方案8】:

        因为字节算术默认返回整数,所以在两种可能的赋值中,较窄的零(字节)类型被提升为 int(oColor.r - percent)。因此,操作的类型是 int。如果没有强制转换,编译器将不允许您将较宽的类型分配给较窄的类型,因为这是一个有损操作。因此你会得到错误,除非你明确地说“我知道我丢失了一些数据,这很好”。

        【讨论】:

          【解决方案9】:

          Arithmetic on bytes 默认生成一个 int 值。

          【讨论】:

          • 链接已失效...
          • @Timothy Cartner,不建议在 SO 上仅提供链接答案,因为它现在已经存在一年,链接已断开。你能提供一些上下文吗?
          猜你喜欢
          • 2012-04-12
          • 2015-01-29
          • 1970-01-01
          • 1970-01-01
          • 2021-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多