Answers:
做吧(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/zh-cn/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 Type的范围,它将抛出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
另一个的结果转换为anint
并将其返回;对于某些值,您的比较将得出错误的结果。