【问题标题】:C# Byte HandlingC# 字节处理
【发布时间】:2014-03-24 17:00:41
【问题描述】:

我在尝试将一些 VB6 逻辑转换为 C# 时遇到了一些问题。在其中一个VB6函数中,有如下语句:

w = Not CByte(w)

其中 w 是long

在一个示例中,在 VB6 中评估此行之后,我可以看到以下更改:
Before: w = 110
After: w = 145

但是,在 C# 中,我重写了该方法以包含以下代码:

w = ~(byte)w;

但是,当我运行相同的示例时,我得到了以下结果:
Before: w = 110
After: w = -111

我也得到了同样的结果:

w = ~(Convert.ToByte(w));

通过以下更改,我终于能够得到正确的结果:

w = ~(byte)w & 0xFF;

据我所知,C# 似乎正在将其转换为 sbyte,即使未指定这样做。我的问题是:我的逻辑有问题吗?这是获得等效 VB6 的唯一方法吗?

【问题讨论】:

  • 您的问题是您对何时算术运算发生的假设是错误的。 ~(byte)w(byte)~w 不同。
  • 查看MSDN 以了解~ 运算符。特别是:为 int、uint、long 和 ulong 预定义了按位补码运算符。

标签: c# vb6 byte negation


【解决方案1】:

wlong,但假设它是 int,这并不重要,只是它更容易解释。

w = ~(byte)w;

好的,所以 w 被转换为 byte .. 然后立即返回到 int,因为这就是算术运算的作用。

您可以通过接受来自 cmets 的 Justin 的建议(在适当的时候进行演员:(byte)~w)来解决这个问题,或者使用这个:

w ^= 0xFF;

虽然严格来说这不是一回事,但如果w 以超出byte 范围的值开始,则情况不同。

【讨论】:

  • 完美!这很有意义——很好的解释。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-15
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多