【问题标题】:1000000000 * 3 = -1294967296?1000000000 * 3 = -1294967296?
【发布时间】:2010-11-03 14:12:10
【问题描述】:

我很困惑!

今天是 11 月 3 日

DateTime DateTime = new DateTime(2010,11,3);
long shazbot = 1000000000 * DateTime.Day;

shazbot 出现在 -1294967296

啊???

【问题讨论】:

  • 我从未使用过 C#,但看起来你的 long 是 32 位。签。嗯。
  • @Josh,在 C# 中 longs64-bit 宽。
  • 尝试将另一对 System::Int32 和 System::Int64 相乘。我不是 C# 开发人员,只是感兴趣。
  • @foret:将两种不同的数字类型相乘会导致implicit conversion 从较小的类型变为较大的类型。 System.Int32 * System.Int64 给你一个System.Int64 回。

标签: c# integer-overflow


【解决方案1】:

shazbot 可能是long,但1000000000DateTime.Day 都不是。因此,C# 首先执行 int 乘法(这会导致溢出),然后将其转换为 long 以存储在 shazbot 中。

如果您想要long 结果,请将其中一个设置为long,如下所示:

long shazbot = 1000000000L * DateTime.Day;

编辑:如果你使用l 而不是L,C# 会给你一个警告。固定。

【讨论】:

  • 如何将我的值转换为 long? Convert.ToInt64?
  • 另外,是的,使用 Alexander 建议的演员表。如果您使用文字来使用类型后缀,那就更容易了。
  • 很好……想知道 .NET 在什么框架中会自己做到这一点。 :)
  • @Soo,"l" 不是技巧,它告诉编译器数字是什么。类似于“d”代表双精度,“f”代表浮点数,“m”代表十进制。否则,如果您提供整数文字,编译器会将其推断为整数,并且所有十进制文字将推断为双精度数。虽然如果要使用字符,建议使用大写 L,因为 l 很容易与 1 混淆。
  • @RobertPitt:我注意到......奇怪的是(相对)简单的答案往往会很快得到大量的支持,但我花了很长时间研究和编写的答案却没有. :|
【解决方案2】:

像这样投长:

long shazbot = 1000000000L * DateTime.Day;

【讨论】:

  • 将其中一个强制转换为long 就足以让表达式求值了。
  • 写的太多了。绝对没有必要同时转换两个操作数。一个就足够了。第二个将被隐式转换为正确的类型。或者,就像 R. Bemrose 建议的那样,编写一个 Long 文字而不是默认的 int 文字,这样在这种情况下就不需要强制转换了。
  • 谢谢,我会改变我的例子。
猜你喜欢
  • 1970-01-01
  • 2013-07-21
  • 2015-07-26
  • 1970-01-01
  • 1970-01-01
  • 2017-03-12
  • 1970-01-01
  • 2017-07-24
  • 1970-01-01
相关资源
最近更新 更多