2010-08-22 3 views
0

2^32 기준으로 주어진 긴 숫자를 곱하려고합니다. 나는 이미 그것을 할 수있는 좋은 알고리즘을 생각했지만, 불행히도 나는 붙어있다. 내가 붙어있는 상황은 2 개의 long int를 곱하고 2^32 단위로 표현하는 것입니다.2 개의 long long int를 올바르게 곱하는 방법은 무엇입니까?

#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"); 
} 

왜 ULLONG_MAX는 ULONG_MAX와 같습니까? http://en.wikipedia.org/wiki/Limits.h#Member_constants에 따르면 18,446,744,073,709,551,615이어야합니다.

내 의견에서 알 수 있듯이 두 uint32의 곱셈 결과를 원합니다. lowerhalf는 0x1이고 upper half는 0xFFFFFFFE입니다. 이 값들은 어떻게 구합니까?

는 (나는 SO에이 질문을 찾았지만 대답은 내 아이디어 아칸소 비슷한 주어진 때문에 내 상황에 도움이되지이다 : Multiplying two long long ints C)

편집 : 내 시스템이 윈도우 XP 32 비트입니다. 나는 (와 Mingw 특수) GCC 3.4.2를 사용하고 코드를 실행하는 동안

는 출력은 내가받을 수 있나요 :

4294967295 
4294967295 
1 
4294967295 

Edit2가 :

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

수익을

4 
8 

편집 3 :Petesh에덕분에 나는 해결책을 찾을 수 있었다 :

printf("%lu\n", c & 0xFFFFFFFF); 
    printf("%lu\n", (c >> 32)); 
+1

어떤 구현을 사용하고 있습니까? 이것은 GCC (32 비트 시스템)에서 잘 작동합니다. 4294967295, 4294967295, 18446744065119617025, 18446744073709551615를 예상대로 인쇄합니다. 아마도 당신의 구현은 % llu 프린트 포맷을 지원하지 않고, % lu와 같이 처리하고 있고, 여러분의 시스템은 리틀 엔디안입니다. 따라서 두 경우 모두 varargs가 인수의 덜 중요한 단어를 선택하게됩니까? –

답변

5

힌트가 시스템에 있습니다 ("일시 중지") - 창가에 있습니까? Microsoft Visual C 런타임을 사용하여 긴 시간을 인쇄하려면 '% I64u'(대문자 i)를 사용해야합니다.

이것은 질문에 근거합니다. How do you printf an unsigned long long int(the format specifier for unsigned long long int)?

+0

MinGW에서도 필요합니다. http://oldwiki.mingw.org/index.php/long%20long – interjay

+0

나는 그것을 보았을 때 mingw를 사용하고있었습니다. – Petesh

3

왜 우분투 10에서 당신의 (지정) 컴파일러하지만 gcc와 그 결과를 받고있어 확실하지가 제공 : 그와

4294967295 
4294967295 
18446744065119617025 
18446744073709551615 

마지막 두 개는 각각 0xfffffffe00000001이고 (2 -1)입니다.

더 최신 컴파일러로 전환하는 것이 좋습니다. 아마도 C99 이전의 컴파일러를 사용하고있는 것일 수 있습니다.

관심 대상이 맞지 않아 sizeof (unsigned long)sizeof (unsigned long long)은 시스템에서 어떤 결과를 줍니까? 이것은 당신의 문제를 설명하기 위해 먼 길을 갈 것입니다. 당신의 sizeof의 자체가 괜찮 데이터 유형을 표시하는 것 때문에


다른 몇 가지 확인합니다 (이 문제가 해결되지 수 있지만 - 그들이 fairly shallow web search 발견되었다) :

  • "%llu" 대신 형식 문자열로 "%I64u"을 사용해보십시오. MinGW에서 MSVCRT 라이브러리를 사용하는 경우 실제 64 비트 printf을 지원해야합니다.
  • -std=c99으로 컴파일하고 있는지 확인하십시오.
+0

내 컴파일러 버전 – citronas

+0

을 추가했습니다. 내 질문에 sizeof 코드 라인을 편집했습니다. – citronas