2016-03-31 15 views
0

私は2つの変数を持っています。uintからintを減算できないのはなぜですか?

int x = 1; 
uint y = 2; 

種類がintuintでなければなりません。しかし、私はそれらと基本的な算術演算を行うことはできません。

y += x; 

暗黙的に型 'intが' 'のuint' に変換できません。明示的な変換 が存在します(キャストがありませんか?)

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

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

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

この動作が他の言語と異なるのはなぜですか?
代替手段がありますか?

私は、これが新しい言語の旅行者であると考えています。
いいえ、私はアンダーフローに頼っていません。

+1

uint' 'へint''から+ = X '変換'にYを実行するためにしなければなりません実行される。その変換は損失の多いコンパイラであるため、明示的に実行する必要があります。 – MarcinJuraszek

答えて

2

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

実際に操作を実行したい場合(つまり、何らかの形で数値が収まることが分かっている場合)は、そのままキャストしたり、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); 
+0

これは負の値かアンダーフローの原因となる可能性があるためintを使用できませんが、別のuintとcase underflowを使用することはできますか?それらはSystem.Int32とSystem.UInt32です。彼らは同じサイズであることが保証されているのではないでしょうか? –

+0

ビット数は同じですが、同じ数値ではありません。たとえば、-1をUint32として表すことはできません。しかし、それらの間に_map_が必要な場合は、どちらかの表現可能な範囲の半分にわたる 'int.MaxValue'を加算または減算することによって"シフト "を適用できます。 – heltonbiker

関連する問題