Antworten:
Tu es einfach (int)myLongValue. Es wird genau das tun, was Sie wollen (MSBs verwerfen und LSBs nehmen) im uncheckedKontext (dies ist die Standardeinstellung des Compilers). Es wird OverflowExceptionin den checkedKontext geworfen, wenn der Wert nicht in Folgendes passt int:
int myIntValue = unchecked((int)myLongValue);
new Random()verwendet Environment.TickCountunter der Haube; Keine Notwendigkeit, manuell mit Uhrzecken zu säen.
uncheckedSie ihn nicht explizit geändert haben, wird das uncheckedSchlüsselwort (wie in dieser Antwort und im Kommentar von @ ChrisMarisic usw. gezeigt) nicht benötigt und int myIntValue = (int)myLongValueist genau gleichwertig. Beachten Sie jedoch, dass unabhängig davon, ob Sie das uncheckedSchlüsselwort verwenden oder nicht, das von @TJCrowder beschriebene nicht-mathematische Verhalten beim unhöflichen Abschneiden angezeigt wird, bei dem das Vorzeichen in einigen Überlauffällen umdrehen kann. Die einzige Möglichkeit, die mathematische Korrektheit wirklich sicherzustellen, besteht darin, den checked(...)Kontext zu verwenden, in dem diese Fälle eine Ausnahme auslösen.
Convert.ToInt32(myValue);
Obwohl ich nicht weiß, was es tun wird, wenn es größer als int.MaxValue ist.
OverflowException , was genau das ist, was das OP nicht will: msdn.microsoft.com/en-us/library/d4haekc4.aspx
Convertnicht gut.
if (value > Int32.MaxValue) return Int32.MaxValue; else return Convert.ToInt32( value );
Manchmal interessiert Sie der tatsächliche Wert nicht wirklich, sondern seine Verwendung als Prüfsumme / Hashcode . In diesem Fall ist die integrierte Methode GetHashCode()eine gute Wahl:
int checkSumAsInt32 = checkSumAsIn64.GetHashCode();
GetHashCodeist dies eine geeignete Wahl. Wenn Sie nach einer dauerhaften Prüfsumme suchen - ein Wert, der beim späteren Ausführen Ihrer App gleich bleibt, verwenden Sie ihn nicht GetHashCode, da nicht garantiert wird, dass er für immer derselbe Algorithmus ist.
Der sicherste und schnellste Weg ist die Verwendung der Bitmaskierung vor dem Wirken ...
int MyInt = (int) ( MyLong & 0xFFFFFFFF )
Der 0xFFFFFFFFWert für Bit Mask ( ) hängt von der Größe von Int ab, da die Größe von Int von der Maschine abhängt.
uncheckedKontext keinen Überlauf - Sie müssen sich jedoch nicht maskieren unchecked, um den Überlauf zu vermeiden. Daher wird eine Lösung nur im checkedKontext benötigt .] Beispiel für 16-Bit. Vorzeichenbehaftete 16-Bit-Holds (-32768, 32767). Das Maskieren mit 0xFFFF ermöglicht einen Wert von bis zu 65535, was zu einem Überlauf (IIRC) führt. Könnte maskieren, um Vorzeichenbit, 0x7FFF oder 0x7FFFFFFF zu vermeiden, wenn nur positiv gewünscht wird.
Es kann konvertieren durch
Convert.ToInt32-Methode
Es wird jedoch eine OverflowException ausgelöst, wenn der Wert außerhalb des Bereichs des Int32-Typs liegt. Ein grundlegender Test zeigt uns, wie es funktioniert:
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.
Hier gibt es eine längere Erklärung.
Würde nicht
(int) Math.Min(Int32.MaxValue, longValue)
mathematisch gesehen der richtige Weg sein?
longValue , intwenn der ursprüngliche Wert zu groß ist. Es fehlt jedoch die gleiche Behandlung von zu negativen Eingaben, die stattdessen die höchstwertigen Bits verlieren würden. Sie müssten auch mit vergleichen Int32.MinValue. Das Originalplakat schien jedoch keine Klemmung zu wollen.
myIntValuekann negativ enden, wennmyLongValuepositiv (4294967294 => -2) ist und umgekehrt (-4294967296 => 0). Wenn Sie beispielsweise eineCompareToOperation implementieren , können Sie das Ergebnis der Subtraktionlongvon einer Operation nicht glücklich in eineintumwandeln und diese zurückgeben. Bei einigen Werten würde Ihr Vergleich zu einem falschen Ergebnis führen.