2017-11-09 3 views
1

Ich möchte einen Integer-Parameter basierend auf seiner hexadezimalen Darstellung deklarieren. Was sind die Unterschiede zwischen: (. Und ja, ich weiß, dass dies nur -1 ist)Hexadezimale Konstanten

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) 

gfortran mich während der Kompilierung einen Integer-Überlauf-Fehler zu geben scheint (sagen mir helfend, dass ich ignorieren kann, dass mit -fno-range-check) für die obigen a und b, aber nicht für c.

Ich muss es Fortran 2003 konform machen, da dieser Code mit anderen Compilern anderswo kompiliert werden kann.

+0

IIRC gab es einige Regeländerungen zwischen Fortran 2003 und 2008. Brauchen Sie streng 2003? –

+0

Der Kodierungsstandard für die Software-Fortran 2003 – chw21

Antwort

2

Die erste und dritte Aussage sind Fortran nicht gültig. Eine Boz-Literal-Konstante kann nur in einer Anzahl von begrenzten Kontexten auftreten - der int-intrinsische ist einer dieser Kontexte.

Die mittlere Anweisung setzt den Wert der benannten Konstante auf einen prozessorabhängigen Wert basierend auf der Bitsequenz, die von der Boz-Literal-Konstante angegeben wird. Der Wert ist prozessorabhängig, da das höchstwertige Bit im resultierenden Wert eins ist.

Ausarbeitung, die Fortran 2008 Regeln (Fortran 2003 war anders, als Vladimir Noten):

  • Die boz literale Konstante eine Folge von 32 Bits eine gibt (oder auf/.true/was auch immer.).
  • INTEGER (INT32) spezifiziert eine ganze Zahl mit einer STORAGE_SIZE von 32 Bits, die vermutlich größer oder gleich der BIT_SIZE eines Objekts dieses Typs ist (Speicherbits und "Wertbits" können aufgrund von Ausrichtungsanforderungen unterschiedlich sein)).
  • Bei Bedarf schneidet die INT-Eigenschaft die Bitsequenz auf die entsprechende Bitgröße ab.
    • Wenn das am weitesten links stehende Bit dieser trunkierten Sequenz Null ist, wird der Wert des intrinsischen INT, wie durch so etwas wie SUM([b(i) * (i-1)**2, i = 1, SIZE(b)]) gegeben ist, wobei B ist eine Matrix, die die Bit-Sequenz, mit der am weitesten rechts liegende Bit in B (1) sind .
    • Wenn das rechte Bit dieser abgeschnittenen Sequenz eins ist, wie im Beispiel, sagt der Standard, dass das Ergebnis prozessorabhängig ist. Dies entspricht der typischen Praxis, das höchstwertige Bit in der internen Repräsentation eines Wertes zu verwenden, um das Vorzeichen darzustellen. Mit der sehr üblichen Zweierkomplementdarstellung von Ganzzahlen erhalten Sie einen Wert von -1.

Unter Fortran 2003 ist die Folge von Bits wird als positive Zahl unter Verwendung der größte Integerdarstellung auf dem Prozessor interpretiert. Der resultierende Wert liegt außerhalb des Bereichs eines INTEGER (INT32) -Objekts, wodurch der Code nicht konform ist.

+0

"Der Wert ist prozessorabhängig, da das höchstwertige Bit im resultierenden Wert eins ist." - Entschuldigung, ich verstehe diesen Satz nicht. Kannst du das vielleicht an einem Beispiel erklären? – chw21

+0

Versuchen, dies auch zu verstehen. Die Interpretation scheint unabhängig von der nativen Architektur Big-Endian zu sein. Aber Sie sagen, die negative Codierung könnte prozessorabhängig sein? Die verschiedenen Dokumente, auf die ich gestoßen bin, sind alle still über die angenommene Kodierung. – agentp

+0

Also ist es prozessorabhängig, weil es davon abhängt, wie der Prozessor vorzeichenbehaftete Ganzzahlen speichert. Gibt es heute Prozessoren, die signierte Ganzzahlen nicht als Zweierkomplement speichern? – chw21