回答:
ただしてください(int)myLongValue
。unchecked
コンテキストで(MSBを破棄し、LSBを取得して)希望どおりに実行します(これはコンパイラのデフォルトです)。値がに収まらない場合はOverflowException
、checked
コンテキスト内でスローされますint
。
int myIntValue = unchecked((int)myLongValue);
new Random()
使用Environment.TickCount
します。クロックティックを手動でシードする必要はありません。
unchecked
なので、明示的に変更しない限り、unchecked
キーワード(この回答や@ChrisMarisicのコメントなどに示されている)は不要であり、int myIntValue = (int)myLongValue
まったく同じです。ただし、unchecked
キーワードを使用するかどうかに関係なく、@ TJCrowderで説明されている非数学的な失礼な切り捨て動作が発生し、オーバーフローの場合に符号が反転する可能性があることに注意してください。数学的な正確さを確実に保証する唯一の方法はchecked(...)
、それらのケースが例外をスローするコンテキストを使用することです。
Convert.ToInt32(myValue);
int.MaxValueより大きい場合はどうなるかわかりませんが。
OverflowException
、これはまさにOPが望まないものです:msdn.microsoft.com/en-us/library/d4haekc4.aspx
Convert
。
if (value > Int32.MaxValue)
return Int32.MaxValue;
else
return Convert.ToInt32( value );
時には、実際の値に実際に関心がなく、checksum / hashcodeとしての使用法に関心がある場合があります。この場合、組み込みの方法GetHashCode()
が適切です。
int checkSumAsInt32 = checkSumAsIn64.GetHashCode();
GetHashCode
は、適切な選択です。あなたが後にしている場合、永続的チェックサム -後であなたのアプリを実行したときと同じになる値は、使用しないでくださいGetHashCode
、永遠に同じアルゴリズムであることが保証されていないとして、。
安全かつ最速の方法は、キャスト前にビットマスキングを使用することです...
int MyInt = (int) ( MyLong & 0xFFFFFFFF )
0xFFFFFFFF
Intサイズはマシンに依存するため、ビットマスク()値はIntのサイズに依存します。
unchecked
コンテキストではオーバーフローは発生しませんが、オーバーフローunchecked
を回避するためにマスクする必要がないため、ソリューションはchecked
コンテキストでのみ必要です。] 16ビットの例。符号付き16ビットホールド(-32768、32767)。0xFFFFでマスキングすると、最大65535の値が許容され、オーバーフロー、IIRCが発生します。正のみが必要な場合は、符号ビットを回避するためにマスクすることができます(0x7FFFまたは0x7FFFFFFF)。
変換できます
Convert.ToInt32メソッド
ただし、値がInt32タイプの範囲外の場合、OverflowExceptionがスローされます。基本的なテストでは、それがどのように機能するかを示します。
long[] numbers = { Int64.MinValue, -1, 0, 121, 340, Int64.MaxValue };
int result;
foreach (long number in numbers)
{
try {
result = Convert.ToInt32(number);
Console.WriteLine("Converted the {0} value {1} to the {2} value {3}.",
number.GetType().Name, number,
result.GetType().Name, result);
}
catch (OverflowException) {
Console.WriteLine("The {0} value {1} is outside the range of the Int32 type.",
number.GetType().Name, number);
}
}
// The example displays the following output:
// The Int64 value -9223372036854775808 is outside the range of the Int32 type.
// Converted the Int64 value -1 to the Int32 value -1.
// Converted the Int64 value 0 to the Int32 value 0.
// Converted the Int64 value 121 to the Int32 value 121.
// Converted the Int64 value 340 to the Int32 value 340.
// The Int64 value 9223372036854775807 is outside the range of the Int32 type.
ここに長い説明があります。
しない
(int) Math.Min(Int32.MaxValue, longValue)
数学的に言えば、正しい方法ですか?
longValue
int
Int32.MinValue
myIntValue
場合myLongValue
は負に4294967294 => -2
なり、その逆(-4294967296 => 0
)の場合もあります。したがって、CompareTo
たとえば演算を実装する場合、あるものlong
から別のものに減算した結果を喜んでキャストしてint
それを返すことはできません。一部の値については、比較によって誤った結果が生じる可能性があります。