0

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));
4

2 に答える 2

5

ヒントはシステムにあります( "pause")-あなたはウィンドウズにいますか?Microsoft Visual Cランタイムを使用して長時間印刷するには、「%I64u」(大文字のi)を使用する必要があります。

これは、SOの質問に基づいています。unsignedlong long int(unsigned long long intのフォーマット指定子)をどのように印刷しますか?

于 2010-08-22T16:16:49.280 に答える
3

(指定されていない)コンパイラでこれらの結果が得られる理由はわかりませんが、Ubuntu10gccでは次のようになります。

4294967295
4294967295
18446744065119617025
18446744073709551615

必要に応じて、最後の2つはそれぞれ0xfffffffe00000001と(2 64 -1)です。

したがって、より最新のコンパイラに切り替えることを検討してください。C99より前のコンパイラを使用している可能性があります。

興味がないのですが、システムで何が行われ、何がsizeof (unsigned long)sizeof (unsigned long long)られるのでしょうか。これはあなたの問題を説明するのに大いに役立ちます。


データ型自体は問題ないことを示しているように見えるので、他にいくつか確認する必要がsizeofあります(ただし、これらは問題を解決しない可能性があります-かなり浅いWeb検索で見つかりました):

  • "%I64u"の代わりにフォーマット文字列として使用してみてください"%llu"。MinGWがMSVCRTライブラリを使用している場合、実際の64ビットprintfサポートに必要になる可能性があります。
  • でコンパイルしていることを確認してください-std=c99
于 2010-08-22T16:06:26.943 に答える