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

如何正确地将两个长整数相乘?

  •  0
  • citronas  · 技术社区  · 14 年前

    我想把以2^32为基础的长数相乘。我已经想到了一个很好的算法,但不幸的是,我卡住了。我所处的情况是,我如何将两个长整数相乘,并在2^32的基础上表示它。

    #include <stdio.h>
    #include <stdlib.h>
    #include <limits.h>
    typedef unsigned int uint32;
    typedef unsigned long long uint64;
    int main(int argc, char* argv[] )
    {
    
      uint64 a = (uint64)ULONG_MAX;
      printf("%llu\n", a);
      uint64 b = (uint64)ULONG_MAX;  
      printf("%llu\n", b);  
      uint64 c = (uint64)(a*b);
    
      printf("%llu\n", c);  // prints 1. that would be to lower 32 bits of the results. the upper half is 0xFFFFFFFE
    
      printf("%llu\n", ULLONG_MAX);
      system("pause");
    }
    

    为什么乌龙马克斯和乌龙马克斯是一样的?根据 http://en.wikipedia.org/wiki/Limits.h#Member_constants 应该是18446744073709551615 I

    正如你们从我的评论中所看到的,我想要两个uint32中的多重情景的结果。

    (我发现这个问题是这样的,但对我的情况没有帮助,因为给出的答案与我的想法相似: Multiplying two long long ints C )

    运行代码时得到的输出:

    4294967295
    4294967295
    1
    4294967295
    

      printf("%i\n", sizeof(unsigned long));
      printf("%i\n", sizeof(unsigned long long)); 
    

    退货

    4
    8
    

    多亏了皮特,我才找到了解决办法:

      printf("%lu\n", c & 0xFFFFFFFF);
      printf("%lu\n", (c >> 32));
    
    2 回复  |  直到 7 年前
        1
  •  5
  •   Community kfsone    7 年前

    提示在系统中(“暂停”)-你在windows上?使用Microsoft visual c运行时打印long long需要使用“%I64u”(大写i)。

    How do you printf an unsigned long long int(the format specifier for unsigned long long int)?

        2
  •  3
  •   paxdiablo    14 年前

    不知道为什么用(未指定的)编译器得到这些结果,但是 gcc 在Ubuntu 10中:

    4294967295
    4294967295
    18446744065119617025
    18446744073709551615
    

    最后两个是 0xfffffffe00000001 和(2) 64

    所以也许可以考虑换一个更先进的编译器。可能您使用的是C99之前的编译器。

    只是出于兴趣,你说什么 sizeof (unsigned long) sizeof (unsigned long long) 在你的系统上给你。这将大大有助于解释你的问题。


    从你出生后还有几件事要检查 sizeof fairly shallow web search ):

    • "%I64u" "%llu" . 如果MinGW使用的是MSVCRT libs,那么可能需要真正的64位 printf
    • 确保您正在编译 -std=c99 .
    推荐文章