7

私の会社のstdint.hヘッダーには次のように書かれています。

#define INT64_MIN -9223372036854775808LL

しかし、私のプロジェクトの一部のコードでは、プログラマーが次のように書いています。

#undef INT64_MIN
#define INT64_MIN (-9223372036854775807LL -1)

次に、この定義をコードで使用します。
プロジェクトは警告/エラーなしでコンパイルされます。
彼の定義を削除してデフォルトのものを使用しようとしたところ、次のようになりました。

error: integer constant is so large that it is unsigned

2 つの定義は同じように見えます。
1 つが正常にコンパイルされ、もう 1 つが失敗するのはなぜですか?

4

1 に答える 1

19

-9223372036854775808LL単一のリテラルではありません。-これは、定数に単項演算子が適用された式9223372036854775808LLです。

その定数は (かろうじて) type の範囲外long longにあるため、警告が発生します。(私long longは64ビットであると仮定していますが、これはほぼ確実です。)

一方、式(-9223372036854775807LL -1)には、 の範囲内にあるリテラルが含まれておりlong long、正しい型であるため (Steve Jessop がコメントで指摘しているように) 、 に対して同様に有効な定義です。INT64_MIN

于 2012-06-29T23:20:53.023 に答える