2

ushort のオーバーフロー/アンダーフローを防ぐコードを書いていました。その前に私は試します:

ushort a = 0; //ushort.MinValue
a -= 1; //returns 65535 (ushort.MaxValue)

次に、実際のコードを書きますが、これが「失敗」することを期待しています (アンダーフローを検出できません)。

ushort oldValue, rate, delta;
ushort newValue = Math.Max(ushort.MinValue, oldValue - rate * delta);

興味深いことに、エラー (CS0266) により、ビルドできません。ushort Max(ushort, ushort)C# はオーバーロードを使用することを期待していますが、オーバーロードを使用しint Max(int, int)ており、ushort値が自動的に変換されintます。もちろん、結果を明示的にキャストすると、ushortこれは正常に機能します。

これは、アンダーフローが発生する可能性があることをC#が検出しているのでint、比較を行うために使用していると思いますか?

4

4 に答える 4

2

これは、oldValue - rate * deltaの結果がタイプであるためintです。これは、演算子 +、-、*、および / が定義されている「最小のデータ型」が であるためですintbyteushortなどは最初に変換されますint。その後、結果は再びint. したがって、明示的に にキャストする必要がありますushort

Convert.ToUInt16または、オーバーフローが発生した場合に例外を発生させる which を使用できます。

于 2012-06-06T14:25:50.827 に答える
1

C# は に昇格(ushort * ushort)int、後続の(ushort - int)操作の結果も として受け取りますint。最後に、オーバーロードの解決は、最初の引数を に昇格させることによりMath.Max(int, int)、呼び出しを選択します。Max(ushort, int)ushortint

(すべての初期化されていない変数に加えて) 問題は、 の結果が でMax(int, int)ありint、 への暗黙的な変換がないことushortです。

詳細については、仕様の次のセクションを参照してください。

  • 7.3.6.2 2 進数の昇格 (「それ以外の場合、両方のオペランドが int 型に変換されます。」)
  • 6.1.2 暗黙の数値変換
  • 7.5.3 オーバーロードの解決
于 2012-06-06T14:27:50.693 に答える