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