4

我在尝试将一些 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 的唯一方法吗?

4

1 回答 1

6

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

w = ~(byte)w;

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

您可以通过从评论中获取贾斯汀的建议来解决它(它在正确的时刻进行演员:)(byte)~w,或者这样:

w ^= 0xFF;

但这并不是严格意义上的同一件事,如果w从 a 范围之外的值开始,情况就会有所不同byte

于 2014-03-24T17:11:19.297 回答