定数10000000000000000000
は、それを表すのに64ビットを必要とします。 16進数では、0x8ac7230489e80000
です。 符号なし 64ビットタイプで表現できますが、符号付き 64ビットタイプではありません。
C99以降、すべての整数定数は符号付きの型で、最初はint
,long int
またはlong long int
の値が入ります。
C90(まだlong long int
を持っていなかった)は、異なる規則を有していた。 C90では、接尾辞のない10進整数定数は、タイプint
,long int
またはunsigned long int
です。
gccのデフォルトモードは-std=gnu90
で、C90標準とGNU固有の拡張機能をサポートしています。 64ビットシステムの場合、long
とunsigned long
は64ビットです。 C90ルールの下では、定数はunsigned long
です(unsigned long
が少なくとも64ビットであると仮定します)。 C99以降の規則では、64ビットより広い整数型がないと仮定すると、それは制約違反です。 (gccバージョン5はデフォルトを-std=gnu11
に変更しました)
明らかにC90ルールで動作しているコンパイラは、コンパイラが動作している標準のエディションによって、10000000000000000000
の意味が異なることを警告しています。
あなたは次のように変更して、あなたのプログラム「仕事」を作ることができます。
#define POWER 10000000000000000000ULL // suffix to specify the type
...
for (unsigned long long = 0; i < POWER; i ++)
...
しかし、それはプログラムが有効になりますが、それは現実的なことはありません。1ナノ秒あたりの反復では、そのループが終了するのに3世紀以上かかるでしょう。私自身の合理的に現代的なコンピュータは、空のfor
のループを約1.6ナノ秒で1回実行します。あなたが解決しようとしている問題が何であれ、それを解決する別の方法を見つけるか、それをより小さな問題に減らすことを提案します。そのループを実行する最速の方法は、ハードウェアが高速になるために数十年待ってから、次にをコンパイルして実行することです。
(これは、ループの本体は非自明である前提としています。ループの本体は何もしない場合、コンパイラは完全にループを離れて最適化することがあります。)
あなたが本当にループにしたいん '10000000000000000000'回? (長いi = 0; i ++)は技術的に同じ(無限ループ) –
@DmitryBychenko私は非常に大きな数を反復しようとしているので、何回も繰り返す必要があります。 – Marievi
'#define POWER 10000000000000000000' - >>' #define POWER 10000000000000000000ULL'と 'int i;' '' '' unsigned long long i; ' – joop