2^32単位で与えられる長い数を掛けたいです。私はすでにそれを行うための素晴らしいアルゴリズムを考えていましたが、残念ながら私は立ち往生しています。私が立ち往生している状況は、2つの長いintを乗算し、それを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");
}
ULLONG_MAXがULONG_MAXと同じなのはなぜですか?http://en.wikipedia.org/wiki/Limits.h#Member_constantsによると、18,446,744,073,709,551,615Iである必要があります。
私のコメントからわかるように、2つのuint32での乗算の結果が必要です。下半分は0x1、上半分は0xFFFFFFFEになります。これらの値を取得するにはどうすればよいですか?
(私はSOでこの質問を見つけましたが、私の考えに似た答えが与えられているので、私の状況では役に立ちません:2つの長い長いintを掛けるC)
編集: 私のシステムはWindowsXP32ビットです。gcc 3.4.2(mingw-special)を使用しています
コードの実行中に取得する出力:
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));