2014-03-24 42 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