我在尝试将一些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等效的唯一方法吗?
答案 0 :(得分:6)
w
是long
,但我们说它是int
,除了它之外它并不重要更容易解释。
w = ~(byte)w;
好的,所以w
会转换为byte
..然后立即返回int
,因为这是算术操作的所在。
你可以通过从评论中获取贾斯汀的建议来解决这个问题(在合适的时刻进行投射:(byte)~w
),或者用这个:
w ^= 0xFF;
但这并非完全相同,如果w
的值超出byte
的范围,则情况会有所不同。