1

私は2つの変数を持っています。

int x = 1;
uint y = 2;

タイプは と のままintでなければなりませんuint。しかし、それらを使って基本的な算術を実行することはできません。

y += x;

タイプ 'int' を 'uint' に暗黙的に変換することはできません。明示的な変換が存在します (キャストがありませんか?)

だから私は毎回このようなことをしなければなりませんか?

if (x < 0)
{
    y -= (uint)Math.Abs(x);
}
else
{
    y += (uint)x;
}

C/C++/Java のバックグラウンドから来ると、これは私を混乱させます。
私がここに欠けているものはありますか?

この動作が言及されている他の言語と異なるのはなぜですか?
より良い代替手段はありますか?

これは、言語の初心者にとってよくある旅行だと思います。
いいえ、私はアンダーフローに頼っていません。

4

1 に答える 1

2

intがに収まるという保証はありません。そのuintため、コンパイラ エラーが発生します。

本当に操作を実行したい場合 (つまり、数値が適合することが何らかの形でわかっている場合) は、以前と同じようにキャストするか、Convertメソッドを使用できます。

if (x < 0)
{
    y -= Convert.ToUint32(Math.Abs(x));
}
else
{
    y += Convert.ToUint32(x);
}

数字が収まるかどうかわからない場合は、それらをクランプすることができます:

uint result = Math.Max(uint.MinValue(Math.Min(uint.MaxValue, x))

uncheckedまた、コンテキストを使用できる場合もあります。これによりエラーが発生することはありませんが、収まりきらないほど大きな値がオーバーフローします。

最後に、可能な値の範囲間でマッピングする場合はint.MaxValue、オフセットとして使用します。

uint x = someuint();
int y = Convert.ToInt32(x - int.MaxValue);

int w = someint();
uint z = Convert.ToUint32(w + int.MaxValue);
于 2016-03-31T02:29:38.367 に答える