6.1.9 Буквальные константы BOZ
Помимо десятичных констант, Fortran также поддерживает двоичные (b), восьмеричные (o) и шестнадцатеричные (z) целочисленные константы. Синтаксис: ‘prefix quote digits quote’, где префикс — это либо b, либо o, либо z, кавычка — это либо ', либо ", а цифры для двоичных — 0 или 1, для восьмеричных — между 0 и 7, а для шестнадцатеричных — между 0 и F. (Пример: b'01011101'.)
До Fortran 95 буквальные константы BOZ разрешалось использовать только для инициализации целочисленных переменных в операторах DATA. Начиная с Fortran 2003, буквальные константы BOZ также разрешается использовать в качестве аргумента REAL, DBLE, INT и CMPLX; результат будет таким же, как если бы целочисленная буквальная константа BOZ была преобразована с помощью TRANSFER в соответственно real, double precision, integer или complex. Как расширение GNU Fortran, встроенные процедуры FLOAT, DFLOAT, COMPLEX и DCMPLX обрабатываются аналогично.
В качестве расширения, GNU Fortran разрешает указывать шестнадцатеричные буквальные константы BOZ с помощью префикса X, помимо стандартного префикса Z. Буквальная константа BOZ также может быть указана путём добавления суффикса к строке, например, Z'ABC' и 'ABC'Z эквивалентны.
Кроме того, GNU Fortran разрешает использовать буквальные константы BOZ вне операторов DATA и четырёх встроенных функций, разрешённых Fortran 2003. В операторах DATA, в прямых присваиваниях, где правая часть содержит только буквенную константу BOZ, и для инициализаторов старого стиля в форме integer i /o'0173'/, константа передаётся так, как будто использовалась TRANSFER; для COMPLEX чисел, инициализируется только действительная часть, если не используется CMPLX. Во всех остальных случаях буквальная константа BOZ преобразуется в значение INTEGER с наибольшим десятичным представлением. Это значение затем численно преобразуется в тип и вид переменной, о которой идёт речь. (Например, real :: r = b'0000001' + 1 инициализирует r значением 2.0.) Поскольку различные компиляторы реализуют расширение по-разному, следует быть осторожными при выполнении побитовой инициализации переменных, не являющихся целыми числами.
Обратите внимание, что инициализация переменной INTEGER оператором, таким как DATA i/Z'FFFFFFFF'/, вызовет ошибку переполнения целых чисел вместо желаемого результата -1, когда i является 32-битным целым числом на системе, поддерживающей 64-битные целые числа. Опция ‘-fno-range-check’ может использоваться как обходной путь для устаревшего кода, который инициализирует целые числа таким образом.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-4.9.3/gfortran/BOZ-literal-constants.html