4

一部の VB6 ロジックを C# に変換しようとしているときに、少し問題が発生しています。VB6 関数の 1 つに、次のステートメントがあります。

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;

私が知る限り、そうするようにsbyte指定されていませんが、C#はそれをに変換しているようです。私の質問は次のとおりです。私の論理に欠陥はありますか? これは、VB6 に相当するものを取得する唯一の方法ですか?

4

1 に答える 1

6

wは ですがlong、 だとしましょうint。説明が少し簡単になることを除いて、実際には問題ではありません。

w = ~(byte)w;

わかりました、そうです .. にwキャストされ、byteすぐに戻ります。これはint算術演算が行うことだからです。

コメントから Justin の提案 (適切なタイミングでキャストを実行します: (byte)~w)を取得するか、次のようにして解決できます。

w ^= 0xFF;

ただし、厳密には同じではありません。 wa の範囲外の値で始まる場合は異なりbyteます。

于 2014-03-24T17:11:19.297 に答える