3

これを gcc (4.6.3) でコンパイルすると、警告は発生せず、結果として -2147483648 が生成されます。

printf ("%d", (1<<31));

これをコンパイルすると、「警告: 式 [-Woverflow] の整数オーバーフロー」が発生し、結果として 2147483647 が生成されます。

printf ("%d". (1<<31)-1);

2 番目の式で整数オーバーフローの警告が表示される理由がわかりません。

4

3 に答える 3

-1
define MAXVAL ((long int) ((unsigned long) (1 << 31) - 1))

このコンストラクトは、コンパイラの警告を取り除きます。計算と結果を処理するために必要な型を作成するだけです。これは を使用しunsigned longて数学を保持し、結果を目的のタイプの に変換しlong intます。

コンパイル中:

 long int x = MAXVAL;

これにより、オーバーフロー警告は発生しません。

于 2014-08-29T15:11:17.430 に答える