代码之家  ›  专栏  ›  技术社区  ›  cbp

简单C问题

c
  •  5
  • cbp  · 技术社区  · 14 年前

    我出生在现代社会,所以我不需要经常处理这种事情,但是有人能解释一下如何在下面的代码中得到正确的数字吗。 以下是许多尝试中的一个:

    #define     X   2527
    #define     Y   2463
    #define     Z   3072
    
    main()
    {
    long int c = X*Y*Z;
    printf("%ld",c);
    }
    

    我只是想打印一个长整数,但它总是打印错误的结果。我是否得到整数溢出-如果是这样,我如何才能防止它们?还是我选择的printf格式化程序?

    4 回复  |  直到 14 年前
        1
  •  8
  •   Svisstack    14 年前

    溢出是可以的,因为您尝试将34位数字写入32位变量( long int ).

    使用 long long int %lld 在格式字符串中。

    #define     X   2527LL
    #define     Y   2463LL
    #define     Z   3072LL
    
    main()
    {
    long long int c = X*Y*Z;
    printf("%lld",c);
    }
    
        2
  •  3
  •   Ofir    14 年前

    问题是,常量不被解释为长整数,只有在计算表达式之后才能转换为长整数。您可以在表达式中强制转换它们来解决这个问题,或者将它们简单地定义为长常量。另外,long可能不够,如果支持long long,则应使用long long。

        3
  •  1
  •   Shamim Hafiz - MSFT    14 年前

    是的,你快溢出来了。答案不适合32位有符号整数,长整数是。你必须使用64位类型,这是长的。

    另外,应该进行类型转换,否则中间计算将溢出。

    #define     X   2527
    #define     Y   2463
    #define     Z   3072
    
    main()
    {
    long long c = (long long)X*Y*Z;
    printf("%lld",c);
    }
    
        4
  •  0
  •   ramshankarramshankar    14 年前
    #define     X   2527.0
    #define     Y   2463
    #define     Z   3072
    
    main()
    {
    double c = X*Y*Z;
    printf("%lf",c);
    }
    

    你也可以用双倍的。