Antworten:
Tu es einfach (int)myLongValue
. Es wird genau das tun, was Sie wollen (MSBs verwerfen und LSBs nehmen) im unchecked
Kontext (dies ist die Standardeinstellung des Compilers). Es wird OverflowException
in den checked
Kontext geworfen, wenn der Wert nicht in Folgendes passt int
:
int myIntValue = unchecked((int)myLongValue);
new Random()
verwendet Environment.TickCount
unter der Haube; Keine Notwendigkeit, manuell mit Uhrzecken zu säen.
unchecked
Sie ihn nicht explizit geändert haben, wird das unchecked
Schlüsselwort (wie in dieser Antwort und im Kommentar von @ ChrisMarisic usw. gezeigt) nicht benötigt und int myIntValue = (int)myLongValue
ist genau gleichwertig. Beachten Sie jedoch, dass unabhängig davon, ob Sie das unchecked
Schlü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
Convert
nicht 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();
GetHashCode
ist 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 0xFFFFFFFF
Wert für Bit Mask ( ) hängt von der Größe von Int ab, da die Größe von Int von der Maschine abhängt.
unchecked
Kontext keinen Überlauf - Sie müssen sich jedoch nicht maskieren unchecked
, um den Überlauf zu vermeiden. Daher wird eine Lösung nur im checked
Kontext 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
, int
wenn 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.
myIntValue
kann negativ enden, wennmyLongValue
positiv (4294967294 => -2
) ist und umgekehrt (-4294967296 => 0
). Wenn Sie beispielsweise eineCompareTo
Operation implementieren , können Sie das Ergebnis der Subtraktionlong
von einer Operation nicht glücklich in eineint
umwandeln und diese zurückgeben. Bei einigen Werten würde Ihr Vergleich zu einem falschen Ergebnis führen.