【问题标题】:c#: adding two big integers gives wrong resultc#:添加两个大整数会给出错误的结果
【发布时间】:2025-12-15 04:45:01
【问题描述】:

所以我有一个将两个整数相加并打印结果的代码:

        Console.WriteLine("enter number: ");
        int intTemp = Convert.ToInt32(Console.ReadLine());
        long sum = intTemp + 5;
        Console.WriteLine($"sum is : {sum}");

但是如果在控制台中我将最大值放入int类型,我不会得到异常,但结果是错误的,即使我将结果保存在一个long变量中。这是输出:

enter number:
2147483647
sum is : -2147483644

但是如果 sum 变量很长,为什么我会得到错误的结果?

【问题讨论】:

  • 因为intTemp + 5 仍然是int,并且那么它被分配给long。您可以使用intTemp + 5L。应该有重复的,但我找不到。
  • add 运算符不知道(也不应该)在哪里你打算存储它的结果,它的类型或大小等。
  • 如果你想看到它崩溃和烧毁,试试long sum = checked(intTemp + 5);。添加两个ints 的结果仍然是int,即使您最终将其分配给long
  • @Damien_The_Unbeliever 所以你说我在任何地方添加两个数字,为​​了 100% 确定我得到正确的结果,我需要将一个转换为 long(假设我将结果保存在一个长变量中)?
  • long intTemp = long.Parse(Console.ReadLine());

标签: c# arithmetic-overflow


【解决方案1】:

结果不是long 类型。它是 int 类型,然后将其转换为 long 以便将其分配给 long 类型的变量。

这是需要做的,如下:

long sum = (long)intTemp + 5;

long sum = intTemp + (long)5;

执行上述任一操作,由于一个操作数是(long)类型,转换后,另一个也将转换为long,以便将两个值相加并将结果存储到@ 987654326@变量。

【讨论】:

  • 所以你是说我在任何地方添加两个数字,为​​了 100% 确定我得到正确的结果,我需要将一个转换为 long(假设我保存导致长变量)?
  • 基本上我想说的是,当你期望两个 int 相加的结果是一个不能用 int 表示并且可以用 long 表示的数字时,转换一个或另一个 long 操作数和两个 long 之间的加法,而不是两个 int 之间的加法。
【解决方案2】:

您必须将 int "intTemp" 转换为 long before,因为只有在计算完成后总和才会转换为 long

【讨论】:

    【解决方案3】:

    键就像已经提到的那样,您需要将其中一个值转换为long 才能保留正确的值,否则结果值在分配给long 之前已经损坏。我想建议您可以在这些数字类型中使用 MaxValue 以使计算内存友好,如果您将在其中使用它进行计算。 int 占用 32 位,long 占用 64 位。如果计算结果仍然是int,那么您可以节省 32 位存储空间,直到您真正需要它为止。在您的示例中,您可以这样做

    if (int.MaxValue - 5) < intTemp ) // it means the value will go above int range if add 5
    {
      // Make conversion to target type before the operation
    }else{ 
      // the value will still be in int range
    }
    

    然后您可以为结果使用适当的存储类型。如果您存储大量结果然后将它们用于进一步计算,它可以变得非常节省内存。希望对您有所帮助。

    【讨论】:

      最近更新 更多