我可以将long转换为int吗?

ins*_*ite 136 c# int types type-conversion long-integer

我想转换longint.

如果long> 的值int.MaxValue,我很乐意让它环绕.

什么是最好的方法?

Meh*_*ari 211

做吧(int)myLongValue.它将完全按照您的需要(丢弃MSB并使用LSB)在unchecked上下文中执行(这是编译器的默认设置).它会扔OverflowExceptionchecked上下文中,如果值不适合的int:

int myIntValue = unchecked((int)myLongValue);
Run Code Online (Sandbox Code Playgroud)

  • @Chris:`new Random()`在引擎盖下使用`Environment.TickCount`; 无需使用时钟滴答器手动播种. (21认同)
  • 用于`new Random(unchecked((int)DateTime.Now.Ticks))`的+1 (19认同)
  • 对于我遇到同样问题的其他人:请注意,丢弃MSB会对结果的*符号*产生影响.有了上述内容,当`myLongValue`为正(`4294967294 => -2`)时,`myIntValue`最终可以为负数,反之亦然(`-4294967296 => 0`).因此,例如,当实现`CompareTo`操作时,你不能愉快地将一个`long`从另一个中减去`int`并返回它; 对于某些值,您的比较会产生不正确的结果. (14认同)
  • 即使这是几年前,我在新的Random中使用它的原因是我在单元测试中获得了相同的结果,我想要变化.使用这个数字给了我差异. (3认同)
  • 默认上下文是`unchecked`,所以除非你明确地改变它,否则不需要`unchecked`关键字(如这个答案和@ChrisMarisic的注释等所示),并且`int myIntValue =(int)myLongValue `完全相同.但请注意,无论您是否使用`unchecked`关键字,都会得到@TJCrowder描述的非数学粗略截断行为,其中符号可以在某些溢出情况下翻转.真正确保数学正确性的唯一方法是使用`checked(...)`上下文,这些情况会引发异常. (3认同)

Max*_*ing 32

Convert.ToInt32(myValue);
Run Code Online (Sandbox Code Playgroud)

虽然我不知道当它比int.MaxValue更大时会做什么.

  • *"虽然我不知道当它大于int.MaxValue时会做什么"*它会抛出一个`OverflowException`,这正是OP不想要的:http://msdn.microsoft.com/ EN-US /库/ d4haekc4.aspx (42认同)
  • 如果在myValue> Integer.Max时需要进行其他处理,请在运行convert之前测试myValue> Integer.Max.转换.ToInt32(myValue)将溢出(我相信也不例外).此方法也适用于VB.NET. (4认同)
  • 虽然(int)有效,但Convert是一个更好的答案.最好有奇怪的例外而不是奇怪的数据. (3认同)

rea*_*art 15

有时您实际上并不对实际值感兴趣,而是将其用作校验和/哈希码.在这种情况下,内置方法GetHashCode()是一个不错的选择:

int checkSumAsInt32 = checkSumAsIn64.GetHashCode();
Run Code Online (Sandbox Code Playgroud)

  • 自从给出这个答案以来,已经有一段时间了,但我想提一下,.NET版本之间的哈希码实现可能会有所不同.这可能实际上并没有发生,但不能保证不同的应用程序运行/ appdomains之间的这个值是相同的. (7认同)

小智 8

一种可能的方法是使用模运算符只让值停留在 int32 范围内,然后将其强制转换为 int。

var intValue= (int)(longValue % Int32.MaxValue);
Run Code Online (Sandbox Code Playgroud)

  • @GuiRitter - 某些大值仍然会变成 0。(MaxValue 的任何倍数)。请考虑“(int)(longValue > Int32.MaxValue ? (longValue % Int32.MaxValue) + 1 : longValue)”。可以为负值添加类似的逻辑: `(int)(longValue < Int32.MinValue ? (longValue % Int32.MaxValue) - 1 ? (longValue > Int32.MaxValue ? (longValue % Int32.MaxValue) + 1 : longValue)) ` (2认同)

小智 7

安全和快速的方法是在演员之前使用Bit Masking ...

int MyInt = (int) ( MyLong & 0xFFFFFFFF )
Run Code Online (Sandbox Code Playgroud)

Bit Mask(0xFFFFFFFF)值取决于Int的大小,因为Int大小取决于机器.


Cle*_*ent 5

如果值超出整数范围,以下解决方案将截断为 int.MinValue/int.MaxValue。

myLong < int.MinValue ? int.MinValue : (myLong > int.MaxValue ? int.MaxValue : (int)myLong)
Run Code Online (Sandbox Code Playgroud)