2017-11-09 3 views
1

16進表現に基づいて整数パラメータを宣言したいと思います。違いは何ですか:16進定数

INTEGER(kind=int32), PARAMETER :: a = Z'FFFFFFFF' 
INTEGER(kind=int32), PARAMETER :: b = int(Z'FFFFFFFF', kind=int32) 
INTEGER(kind=int32), PARAMETER :: c = transfer(Z'FFFFFFFF', 1_int32) 

は(そして、はい、私はこれがちょうど-1であることを知っている。)

gfortranは、(親切に私はそれを無視することができることを私に言って、コンパイル時に私に整数オーバーフローのエラーを与えているようです-fno-range-checkで)上記のaおよびbでは、しかしcではない。

このコードは別のコンパイラでコンパイルされる可能性があるため、Fortran 2003に準拠させる必要があります。

+0

IIRC Fortran 2003と2008の間にルールに若干の変更がありました。厳密には2003年が必要ですか? –

+0

ソフトウェア状態Fortran 2003のコーディング規格 – chw21

答えて

2

第1および第3ステートメントは有効なFortranではありません。 bozリテラル定数は、いくつかの限られたコンテキストにしか現れません。int intrinsicは、それらのコンテキストの1つです。

middleステートメントは、boz-literal-constantで指定されたビットのシーケンスに基づいて、名前付き定数の値をプロセッサに依存する値に設定します。結果の値の最上位ビットが1であるため、値はプロセッサに依存します。 Fortranの2008年規則を使用して

エラボレーション、(ウラジミールノートとしてのFortran 2003は、異なっていた):

  • BOZリテラル定数は32一つの配列を指定するビット(またはオン/ .TRUEを/何でも。)。
  • INTEGER(INT32)は、32ビットのSTORAGE_SIZEを持つ整数を指定します。これはおそらく、そのタイプのオブジェクトのBIT_SIZE以上です(格納ビットと「値ビット」はアライメント要件)。
  • INT組み込み関数は、必要に応じて、ビットシーケンスを適切なビットサイズに切り捨てます。そのトランケート配列の左端のビットが0であった場合
    • は、INTの固有の値が右端のビットがBであることと、bはビットシーケンスを表す配列であるSUM([b(i) * (i-1)**2, i = 1, SIZE(b)])ようなものによって与えられるように(1) 。
    • この例のように、切り捨てられたシーケンスの右端のビットが1である場合、その結果はプロセッサに依存していると言います。これは、符号を表すために値の内部表現に最上位ビットを使用する典型的な方法に対応するためです。整数の非常に一般的な2の補数表現では、-1の値が得られます。 Fortran 2003の下

ビットのシーケンスは、プロセッサ上で利用可能な最大の整数表現を使用して、正の数として解釈されます。結果の値は、INTEGER(INT32)オブジェクトの範囲外になり、コードが不適合になります。

+0

"結果値の最上位ビットが1であるため、値はプロセッサに依存します。" - 申し訳ありませんが、私はその文を理解していません。あなたはたぶんそれを例で説明できますか? – chw21

+0

これも同様に理解しようとしています。この解釈は、ネイティブアーキテクチャに関係なくビッグエンディアンと思われます。しかし、あなたは否定的なエンコーディングがプロセッサに依存するかもしれないと言っていますか?私が遭遇したさまざまなドキュメントは、想定されているエンコーディングについては何も言いません。 – agentp

+0

したがって、プロセッサが符号付き整数をどのように格納するかに依存するため、プロセッサに依存します。符号付き整数を2の補数として格納していないプロセッサが今日あるのですか? – chw21