2014-03-24 40 views
4

我在尝试将一些VB6逻辑转换为C#时遇到了一些问题。在VB6的功能之一,它具有以下声明:C#字节处理

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等价物的唯一方法吗?

+3

你的问题是你的假设*当*算术运算发生错误。 '〜(byte)w'不同于'(byte)〜w'。 – aevitas

+0

查看[〜]运算符的[MSDN](http://msdn.microsoft.com/zh-cn/library/d2bd4x66.aspx)。特别是:*按位补数运算符为int,uint,long和ulong预定义。* –

回答

6

w是一个long,但我们假设它是一个int,除了稍微容易解释它并不重要。

w = ~(byte)w; 

好了,w被转换为byte ..然后立刻回int因为那是算术运算做。

你可以通过采取从注释贾斯汀的建议(它投在正确的时刻:(byte)~w)解决它,或与此:

w ^= 0xFF; 

那是不是严格,虽然同样的事情,这是不同的如果w的起始值超出范围byte

+0

+1简单和完整的说明 –

+0

很好的解释 –

+0

完美!这很有意义 - 很好的解释。谢谢! – Siyual