C#字节处理

时间:2014-03-24 17:00:41

标签: c# vb6 byte negation

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

1 个答案:

答案 0 :(得分:6)

wlong,但我们说它是int,除了它之外它并不重要更容易解释。

w = ~(byte)w;

好的,所以w会转换为byte ..然后立即返回int,因为这是算术操作的所在。

你可以通过从评论中获取贾斯汀的建议来解决这个问题(在合适的时刻进行投射:(byte)~w),或者用这个:

w ^= 0xFF;

但这并非完全相同,如果w的值超出byte的范围,则情况会有所不同。