C#でuintをintに変換するにはどうすればよいですか?


99

C#でuintをintに変換するにはどうすればよいですか?


5
これを行うと、intの値がオーバーフローする可能性があることに注意してください。
パワーロード2009

1
はい、uintの値がInt32.MaxValue(たまたま2,147,483,647)より大きい場合は、オブジェクトを受け入れ可能な状態にして例外を適切に処理する必要があります
Michael Meadows

変換する方が安全だろうuintlonglong、すべて含めることができるuintような値intではない(でき既に述べたように
リアム・

回答:


186

与えられた:

 uint n = 3;

int i = checked((int)n); //throws OverflowException if n > Int32.MaxValue
int i = unchecked((int)n); //converts the bits only 
                           //i will be negative if n > Int32.MaxValue

int i = (int)n; //same behavior as unchecked

または

int i = Convert.ToInt32(n); //same behavior as checked

-編集

Kenan EKによって言及された情報が含まれています


4
なお、場合uintよりも大きいint.MaxValue使用する場合は、キャスト、または例外を使用する場合は陰性の結果を得るでしょうConvert.ToInt32
LukeH 2009

4
これにより、Convert.ToInt32がimoのより良い選択になります。
mmcdole 2009

4
@ルーク-いいえ、必ずしもそうとは限りません。キャストするときは、プロジェクトのビルド設定によって、チェックありまたはチェックなしの算術がデフォルトであるかどうかによって異なります。さらに、checkedキーワードとuncheckedキーワードを使用して、ローカルでこれを変更できます。
グレッグブナ

@Greg:そのとおりですが、デフォルトの既定の設定はオフになっています。
LukeH 2009

@GregBeechこの動作は移植可能ですか?チェックされていないアプローチの場合??

12

checkeduncheckedキーワードに注意してください。

結果がintに切り捨てられるか、結果が符号付き32ビットに収まらない場合に例外が発生するかが重要です。デフォルトはオフです。


2
デフォルトはオフになっていると思います。これを指摘するための+1-デバッグが難しいエラーの原因。

あなたは正しい、私の悪い、ありがとう!-"このオプションのデフォルト値は/ checked
Kenan EK

オフにすると「切り捨て」られません。
フラクター

9

1つのタイプから32ビットを単純に持ち上げて、そのまま他のタイプにダンプしたいとします。

uint asUint = unchecked((uint)myInt);
int asInt = unchecked((int)myUint);

宛先タイプは32ビットを盲目的に選択し、それらを再解釈します。

逆に、10進数/数値を宛先タイプ自体の範囲内に維持することに関心がある場合:

uint asUint = checked((uint)myInt);
int asInt = checked((int)myUint);

この場合、次の場合にオーバーフロー例外が発生します。

  • 負のint(例:-1)をuintにキャストする
  • 2,147,483,648〜4,294,967,295の正のuintをintにキャストする

私たちのケースでは、 unchecked 32ビットをそのまま保持ソリューションが必要だったので、ここにいくつかの例を示します。

int => uint

int....: 0000000000 (00-00-00-00)
asUint.: 0000000000 (00-00-00-00)
------------------------------
int....: 0000000001 (01-00-00-00)
asUint.: 0000000001 (01-00-00-00)
------------------------------
int....: -0000000001 (FF-FF-FF-FF)
asUint.: 4294967295 (FF-FF-FF-FF)
------------------------------
int....: 2147483647 (FF-FF-FF-7F)
asUint.: 2147483647 (FF-FF-FF-7F)
------------------------------
int....: -2147483648 (00-00-00-80)
asUint.: 2147483648 (00-00-00-80)

uint => int

uint...: 0000000000 (00-00-00-00)
asInt..: 0000000000 (00-00-00-00)
------------------------------
uint...: 0000000001 (01-00-00-00)
asInt..: 0000000001 (01-00-00-00)
------------------------------
uint...: 2147483647 (FF-FF-FF-7F)
asInt..: 2147483647 (FF-FF-FF-7F)
------------------------------
uint...: 4294967295 (FF-FF-FF-FF)
asInt..: -0000000001 (FF-FF-FF-FF)
------------------------------

コード

int[] testInts = { 0, 1, -1, int.MaxValue, int.MinValue };
uint[] testUints = { uint.MinValue, 1, uint.MaxValue / 2, uint.MaxValue };

foreach (var Int in testInts)
{
    uint asUint = unchecked((uint)Int);
    Console.WriteLine("int....: {0:D10} ({1})", Int, BitConverter.ToString(BitConverter.GetBytes(Int)));
    Console.WriteLine("asUint.: {0:D10} ({1})", asUint, BitConverter.ToString(BitConverter.GetBytes(asUint)));
    Console.WriteLine(new string('-',30));
}
Console.WriteLine(new string('=', 30));
foreach (var Uint in testUints)
{
    int asInt = unchecked((int)Uint);
    Console.WriteLine("uint...: {0:D10} ({1})", Uint, BitConverter.ToString(BitConverter.GetBytes(Uint)));
    Console.WriteLine("asInt..: {0:D10} ({1})", asInt, BitConverter.ToString(BitConverter.GetBytes(asInt)));
    Console.WriteLine(new string('-', 30));
}  


0

uintに含まれる値をintで表すことができると仮定すると、次のように簡単です。

int val = (int) uval;


0

私はtryParseを使用すると言うでしょう、uintがintに対して大きすぎる場合は 'false'を返します。
> 0になる限り、uintはintよりもはるかに大きくなることを忘れないでください。



-1
int intNumber = (int)uintNumber;

期待する値の種類によっては、変換を実行する前にuintNumberの大きさを確認する必要があります。intの最大値はuintの約.5です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.