【问题标题】:Issue in Adding large numbers in C# with int datatype在 C# 中使用 int 数据类型添加大数的问题
【发布时间】:2020-02-20 12:50:21
【问题描述】:

我正在尝试使用int 数据类型在C# 中添加五个大数。但结果并不正确。为什么.net 迫使我转换为long 并执行添加以获得正确的结果。

using System;       
public class Program
{
    public static void Main()
    {
        int i1= 256741038,i2=  623958417,i3=  467905213 ,i4= 714532089,i5=938071625;
        long l1= 256741038,l2=  623958417,l3=  467905213 ,l4= 714532089,l5=938071625; 
        long result1=i2+i3+i4+i5;
        long result2=l2+l3+l4+l5;
        long result3=(long)l2+(long)l3+(long)l4+(long)l5;
        Console.WriteLine(result1);
        Console.WriteLine(result2);
        Console.WriteLine(result3);
        }
}

【问题讨论】:

    标签: c# .net int long-integer


    【解决方案1】:

    由于性能 C#(不是 dotnet)和我知道的任何其他语言都使用 LARGEST 公分母来执行操作。这是他们之间的共同点。不是结果,只能猜。

    所以,添加 2 个 int 数字是一个可能溢出的 int 操作。将 int 添加到 long 是一个很长的操作。加两个 long 是一个 long 操作。

    就这么简单。如果您知道会溢出,则将其中一种类型声明为更长。

    现在,你可以施放——你也可以只声明它们,你知道的。

    C# short/long/int literal format?

    向您展示所有内容。

    • 1111 是一个整数
    • 1111UL 是一个无符号长整数。

    因此,如果您告诉编译器在文字中使用正确的数据类型,则无需强制转换。

    【讨论】:

      【解决方案2】:

      除了少数例外,C# 中的类型解析并不关心您分配给到 的类型。在您的情况下,编译器正在考虑的所有内容是

      i2 + i3 + i4 + i5
      

      由于每个操作数都是int 类型,结果也是 类型int(或者,更准确地说,它使用加法运算符,将两个ints 作为参数并返回 int),即使您稍后将其分配给 long 本地。

      通过将操作数之一转换为long,int, int -> int 运算符不再适用,而选择了long, long -> long。 float 也是如此,例如 - 只要其中一个操作数是 float,结果就是 float - 否则,a / b 会给你整数除法(运算符 int, int -> int)。

      通常,您需要确保您使用的数据类型足够大以容纳结果和任何中间值。如果您期望的结果不适合 int,请不要使用 int。默认情况下,C# 不检查溢出 - 您可以像这样覆盖它:

      var result = checked(i2 + i3 + i4 + i5);
      

      这样,您会得到一个异常,而不是默默地环绕到错误的 int 值。

      【讨论】:

        【解决方案3】:

        正如其他答案所说,您可以使用checked keyword 来查看long result1=i2+i3+i4+i5; 正在生成System.OverflowException: 'Arithmetic operation resulted in an overflow.'。您的操作的有效结果是 2,744,467,344,但 int 的最大值(也就是 Int32)是 2,147,483,647。 Long 类型(Int64 的别名)最多可以包含 9,223,372,036,854,775,807,这足以添加您的数字而不会溢出。

        public static void Main()
        {
            checked
            {
                int i1 = 256741038, i2 = 623958417, i3 = 467905213, i4 = 714532089, i5 = 938071625;
                long l1 = 256741038, l2 = 623958417, l3 = 467905213, l4 = 714532089, l5 = 938071625;
                long result1 = i2 + i3 + i4 + i5;
                long result2 = l2 + l3 + l4 + l5;
                long result3 = (long)l2 + (long)l3 + (long)l4 + (long)l5;
                Console.WriteLine(result1);
                Console.WriteLine(result2);
                Console.WriteLine(result3);
                Console.Read();
            }
        }
        

        【讨论】:

          【解决方案4】:

          int 有一个maximum value of 2,147,483,647。如果您尝试创建一个比这更大的int(例如,通过添加两个较小的ints),它将变成一个非常大的负数。这就是result1 中正在发生的事情。

          long 要大得多,最大值为 9,223,372,036,854,775,807。这足以容纳您尝试表示的值。

          【讨论】:

          • 这绝不是对添加过程中发生的情况的解释。
          • @TomTom 被“如果你尝试制作比这更大的 int ”覆盖,不是吗?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-26
          • 2014-06-05
          • 2021-12-12
          • 2012-01-18
          相关资源
          最近更新 更多