2016-04-04 5 views
5

C#を使用してint32の最大範囲より大きい大きな数値をint32に変換したい。したがって、最大範囲2147483647を超えている場合は、-2147483648から再び開始されます。今のところ、私はこれを次のようにしています:Int32.Maximum +値の数値をint32に変換する

long val = 3903086636L; 
long rem = val % 2147483648L; 
long div = val/2147483648L; 
int result = div % 2 == 0 ? (int)rem - 1 : -2147483648 + (int)rem; 

私はこれを正しく行うと確信しています。 C#でこれを行うためのユーティリティ関数や簡単な方法はありますか?

答えて

5

あなたはchecked modeはちょうどそれはあなたが期待するようオーバーフローを処理するキャスト、有効になっていない場合:それはコンパイラ設定独立させるために、マシュー・ワトソンによって示唆されているように、

int i = (int)val; 

をまたは:

これは例外をスローしません。整数はオーバーフローし、int.MinValueから数え続けます。

証明:

long val = (long)int.MaxValue + 1; 
int result = (int)val; 

Console.WriteLine(result == int.MinValue); // true 
+0

チェックモードを無効にすると、アプリケーションに影響がありますか? – Arnab

+0

デフォルトでは無効になっています。 –

+4

あるいは 'int i = unchecked((int val);)'と書くことができ、コンパイラの 'checked'設定に関係なく動作します。 –

0

なぜ単にint.MinValueに残りの部分を追加しない:

long tmp = myValue - int.MaxValue; 
while(tmp > int.MaxValue) tmp -= int.MaxValue; 

if (tmp > 0) tmp = int.MinValue + tmp; 

ループはあなたにも2 * int.MaxValueそして、大きい数字で作業ができることを保持します。

これを使用してmyValue = 3 * int.MaxValue + 1でテストすると、結果として2147483647が返されます。

+1

'myValue'が' 4 * int.MaxValue'と等しい場合はどうなりますか? – wimh

+0

@ウィルメル良い点、私はこのケースではループが必要だと思いますが、すぐにこれを更新します。 – HimBromBeere

+0

'myValue'が' int.MaxValue + 1'と等しい場合、結果は 'int.MinValue + 1'ではなく' int.MinValue'でなければなりません。 'myValue'が' 2 * int.MaxValue + 2'と等しい場合、結果は 'int'MinValue + 2ではなく' 0'であると考えられます。 – wimh

関連する問題