C#字节处理

C#字节处理,c#,vb6,byte,negation,C#,Vb6,Byte,Negation,我在尝试将某些VB6逻辑转换为C#时遇到了一点问题。在其中一个VB6函数中,它具有以下语句: w = Not CByte(w) 其中w是一个长的 在一个示例中,在VB6中对此行求值后,我可以看到以下更改: 之前:w=110 之后:w=145 但是,在C#中,我重写了该方法以包含以下代码: w = ~(byte)w; 但是,当我运行相同的示例时,我得到的结果是: 之前:w=110 之后:w=-111 我还通过以下操作获得了相同的结果: w = ~(Convert.ToByte(w)); 通过

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

w = Not CByte(w)
其中w是一个
长的

在一个示例中,在VB6中对此行求值后,我可以看到以下更改:
之前:w=110

之后:w=145

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

w = ~(byte)w;
但是,当我运行相同的示例时,我得到的结果是:
之前:w=110

之后:w=-111

我还通过以下操作获得了相同的结果:

w = ~(Convert.ToByte(w));
通过以下更改,我终于能够得到正确的结果:

w = ~(byte)w & 0xFF;

据我所知,看起来C#正在将其转换为
sbyte
,尽管没有指定要这样做。我的问题是:我的逻辑有缺陷吗?这是获得VB6等价物的唯一方法吗?

w
是一个
长的
,但假设它是一个
int
,它其实并不重要,只是更容易解释

w = ~(byte)w;
好的,所以
w
被转换为
字节。。然后立即返回到
int
,因为算术运算就是这样做的

你可以从评论中采纳贾斯汀的建议来解决这个问题(在适当的时候做演员:
(byte)~w
),或者:

w ^= 0xFF;

但严格来说这不是同一件事,如果
w
开始时的值超出了
字节的范围,则情况就不同了
的问题在于您对算术运算何时发生的假设是错误的
~(byte)w
(byte)~w
不同。有关
~
运算符,请参阅。特别是:按位补码运算符是为int、uint、long和ulong预定义的。完美!这很有道理——很好的解释。谢谢