4
integer, parameter :: m = -2147483648

コンパイラ エラーにつながります:「その種類に対して整数が大きすぎます」が、

integer, parameter :: m = -2147483647 - 1

動作しているようで、正しい結果が得られます。これは、コンパイラが 2147483648 を否定する前にチェックし、整数型をオーバーフローさせるためだと思います。減算 1 ハックは目的の初期化を行うように見えますが、使用する「ベスト プラクティス」の方法はありますか?

4

3 に答える 3

5

問題は、Fortran 標準が対称間隔を持つ「モデル番号」に関して整数を定義していることです。GFortran (エラー メッセージに基づいて使用しているようです) は、2 の補数ハードウェアがそのような数値を表すことができるにもかかわらず、Fortran モデル番号ではない整数リテラルを許可しません。このチェックは解析段階で行われるため、「-huge(0) - 1」などの式が後でコンパイル プロセス中に定数として折りたたまれても、エラー メッセージは表示されません。

GFortran では、-fno-range-check でこのチェックを無効にすることができます。

于 2012-09-08T07:09:21.923 に答える
1

ご想像のとおり、コンパイラは -2147483648 を値 +2147483648 の単項否定として解釈しており、その中間値は符号付き 32 ビット整数には大きすぎます。

ベスト プラクティスに関しては、INT_MIN私が見た のすべての定義は次の用語で表されます-INT_MAX - 1

ベスト プラクティスは、この定数を直接表現するのではなく、正しい処理を行うためにコンパイラの定数の折りたたみに依存することであると結論付けています。

于 2012-09-07T21:53:52.490 に答える
0

2147483648 は存在しません。最大値は 32 ビットで 2147483647 です。integer*8 変数を使用する必要があります。これは、より大きな数値を使用できる 64 ビット整数です。

于 2012-09-07T21:09:47.663 に答える