【问题标题】:Calculation differences [duplicate]计算差异[重复]
【发布时间】:2013-07-10 03:07:48
【问题描述】:

我在 c# 中有这样的东西

        byte a;
        byte b;
        byte c;

        c = a + b;

它给 c = a + b 一个错误并说“不能隐式地将类型'int'转换为'byte'。存在显式转换(你是否缺少演员表?)。我不明白为什么,因为一切以字节为单位

涉及 Matlab 是因为我正在将一个图像处理程序从 matlab 翻译成 c#,在 c# 中我从 uint8 的图片中获取值并使用该值进行计算,当它这样做时,unit8 接管并且在任何计算期间高于任何数字255 设置为 255。所以在 c# 中,我只是将所有变量都设为字节,因为无论如何它们都低于 255,但就像在示例代码中运行计算时会弹出错误一样。

【问题讨论】:

标签: c# matlab byte uint


【解决方案1】:

在任何计算过程中,任何大于 255 的数字都设置为 255。

这在 C# 中本机不支持。相反,(byte) 强制转换的默认行为是采用最低有效字节,给出相当于模 256 的算术结果。

c = unchecked((byte)(200 + 200));

上面的结果将是144,相当于400 % 256

如果要在 255 处剪辑结果,则需要明确指定:

c = (byte)Math.Min(a + b, 255);

【讨论】:

  • 如果我有一长串计算,我是否必须将它们中的每一个都转换为字节,所以应该是 (byte)(a+b)*(c+d) 而不是 (byte)( a+b)*(字节)(c+d)
  • @user2521432:我假设你想在最后投射:(byte)((a+b)*(c+d))
  • 但它是否会在计算结束时进行最大操作,或者如果我在一行上有一堆较小的计算,它是否也会将它们中的每一个都剪裁为 255?因为这就是它在 matlab 中所做的事情
  • @user2521432:Min 操作将应用于您明确插入的任何位置。对于您给出的示例,它没有任何区别,但是如果您有减法和除法,则需要在 每个 计算中使用它以获得与您描述的结果一致的结果。例如,200+200-100 必须表示为 Math.Min(Math.Min(200+200,255)-100,255),这将给出 155
【解决方案2】:

赋值运算符右侧的算术表达式默认为int

byte - MSDN

下面的赋值语句会产生编译错误, 因为右边的算术表达式 赋值运算符默认为 int。

byte x = 10, y = 20;
byte z = x + y;   // Error: conversion from int to byte

通过添加显式转换,错误将如下所示:

byte z = (byte)(x + y);   

【讨论】:

  • 正如提供的链接所说,我之前确实尝试过投射它们,但是我在 c# 中得到的计算与我在 matlab 中得到的不同
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
  • 2020-10-27
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
  • 2016-08-26
相关资源
最近更新 更多