8

2つの質問

まず、その間

long long int num = 1000000000000;

正常に動作します

long long int num = 4014109449;

与える

warning: this decimal constant is unsigned only in ISO C90 [enabled by default]

どういう意味ですか ?

第二に

long long int num = 1000000*1000000;

オーバーフロー警告を出す

long long int num = 1000000000000;

それらは同じですが、大丈夫です。どうすればそれを取り除くことができますか? 乗算はガベージ値を与える

4

2 に答える 2

10

問題は、値がC90では4014109449anであるが、C99 では a であるということです。これは、32 ビットの には大きすぎるためです。whileはどの32 ビット型にも大きすぎるため、自動的に. この警告は、C90 と C99 で動作が異なるという事実に関連しています。unsigned long intlong long intlong int1000000000000long long int

解決策は、適切な型サフィックスを使用して、リテラルと変数型の間で型の一致を強制することです。この場合:

long long num = 4014109449LL ;

または型キャストを使用します。

long long num = (long long)4014109449 ;

同様に、式は 2 つの型1000000 * 1000000の乗算であり、結果がありますが、オーバーフローが発生します。式のより大きな型への自動昇格はありません。解決策は、リテラルの型を明示することです。intintint

long long num = 1000000LL * 1000000LL;

または、一方または両方のオペランドで型キャストを使用することもできます。

long long num = (long long)1000000 * 1000000;
于 2013-11-06T18:14:04.907 に答える
4

C90 では、サフィックスのない 10 進整数定数 (リテラル) の型は、

  • int
  • long int
  • unsigned long int

オーバーフローせずに値を表すことができます。

C99 以降では、

  • int
  • long int
  • long long int

その価値を表すことができます。

4014109449はたまたま 32 ビットの符号なし整数として表現できますが、32 ビットの符号付き整数としては表現できません。システムに 32 ビットlongの s があると仮定すると、その定数の型はunsigned long intC90、long long intC99、および C11 にあります。

それが警告があなたに伝えていることです。定数の型は、コンパイラが準拠している C 標準のバージョンによって異なります。

その型に関係なく、の値4014109449は常に正しいことに注意してください。また、宣言では次のようになります。

long long int num = 1000000000000;

その値は常に正しく に変換されlong longます。LLしかし、 type の値が必要であることを明示するために接尾辞を追加しても問題はありません (そして警告を黙らせます) long long:

long long int num = 1000000000000LL;

これに関しては:

long long int num = 1000000*1000000;

32 ビットintの s があると仮定すると、定数1000000の型は であり、2 つの値intを乗算した結果の型も です。この場合、乗算はオーバーフローします。繰り返しますが、定数の型が であることを確認することで、問題を回避できます。intintlong long int

long long int num = 1000000LL * 1000000LL;

(小文字を使用できることに注意してください。ただし、文字と数字llを区別するのが難しい場合があるため、お勧めできません。)l1

于 2013-11-06T18:37:46.243 に答える