C90 では、サフィックスのない 10 進整数定数 (リテラル) の型は、
int
long int
unsigned long int
オーバーフローせずに値を表すことができます。
C99 以降では、
int
long int
long long int
その価値を表すことができます。
値4014109449
はたまたま 32 ビットの符号なし整数として表現できますが、32 ビットの符号付き整数としては表現できません。システムに 32 ビットlong
の s があると仮定すると、その定数の型はunsigned long int
C90、long long int
C99、および 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
を乗算した結果の型も です。この場合、乗算はオーバーフローします。繰り返しますが、定数の型が であることを確認することで、問題を回避できます。int
int
long long int
long long int num = 1000000LL * 1000000LL;
(小文字を使用できることに注意してください。ただし、文字と数字ll
を区別するのが難しい場合があるため、お勧めできません。)l
1