2010-07-03 6 views
41

Я пытаюсь изучить Fortran, и я вижу, как много разных определений передаются, и мне интересно, пытаются ли они совершить то же самое. В чем разница между следующим?Fortran: integer * 4 vs integer (4) vs integer (kind = 4)

  • integer*4
  • integer(4)
  • integer(kind=4)

ответ

42

В Fortran> = 90, лучший подход используют встроенные функции для определения точности, что нужно - это гарантирует как портативность и что вы получите то, что вам нужно. Например, чтобы получить целые числа я и my_int, которые будут поддерживать по крайней мере 8 десятичных цифр, вы можете использовать:

integer, parameter :: RegInt_K = selected_int_kind (8) 
integer (kind=RegInt_K) :: i, my_int 

Определив «RegInt_K» (или любое имя вы выбрали) в качестве параметра, вы можете использовать его в течение ваш код как символ. Это также позволяет легко изменять точность.

Запрос на 8 или 9 десятичных цифр обычно будет получать 4-байтовое целое число.

integer * 4 является общим расширением, возвращаясь к старым FORTRAN, чтобы указать 4-байтовое целое число.

integer (4) или integer (RegInt_K) являются short для integer (kind = 4) или integer (kind = RegInt_K). integer (4) не совпадает с целым числом * 4 и не переносится - в стандарте языка не указаны числовые значения видов. Большинство компиляторов используют тип = 4 для 4-байтовых целых чисел - для этих компиляторов integer * 4 и integer (4) будет предоставлен один и тот же целочисленный тип, но есть исключения, поэтому целое число (4) не переносится и лучше избегать ,

Подход для реалов аналогичен.

UPDATE: если вы не хотите указывать числовые типы с требуемой точностью, но вместо того, чтобы использовать хранилище, которое они будут использовать, Fortran 2008 предоставляет метод. вещественные числа и целые числа могут быть заданы числом бит хранения после use ING в ISO_FORTRAN_ENV модуле, например, для 4-байтовый (32 бита) целого числа:

use ISO_FORTRAN_ENV 
integer (int32) :: MyInt 

В руководстве gfortran содержит документацию в соответствии с «внутренним модули».

+0

Это было потрясающее объяснение! оглушающий! отлично! теперь это кристально ясно.: D Большое спасибо! – Sam

19

Просто еще одно явное объяснение, что такое вид. Компилятор имеет таблицу разных числовых типов. Все целые типы различаются Виды основного типа - integer. Предположим, что у компилятора есть 1 байт, 2 байта, 4 байта, 8 байт и 16 байт integer (или real). В таблице компилятор имеет индекс для каждого такого типа - этот индекс является номером вида.

Многие компиляторы выбирают эту нумерацию:

kind number number of bytes 
1    1 
2    2 
4    4 
8    8 
16    16 

Но они могут выбрать любую другую нумерацию. Одна из очевидных возможностей -

kind number number of bytes 
1    1 
2    2 
3    4 
4    8 
5    16 

Есть действительно компиляторы (по крайней мере, g77 и NAG), которые выбирают этот подход. Есть также варианты, чтобы изменить это.Поэтому номера kind не переносимы integer(kind=4) или integer(4) означает целое число 4 байта или целое число 8 байтов в зависимости от компилятора.

integer*4 переносится в том смысле, что оно всегда означает 4 байта. Но, с другой стороны, он не переносится, потому что он никогда не был частью какого-либо стандарта. Программы, использующие эту нотацию, недействительны Fortran 77, 90 или любой другой Fortran.

Чтобы увидеть правильные варианты настройки номеров видов, см. Ответ М.С.Б.

То же самое относится к типам данных real. См. Fortran 90 kind parameter (ответ mataap).

+1

Интересно, что формы типа (вида) и типа * не являются полностью взаимозаменяемыми и требуют внимания. Например, в Intel Fortran integer (6) и integer * 4 совпадают, но: COMPLEX ([KIND =] 4) совпадает с COMPLEX * 8, КОМПЛЕКС ([KIND =] 8) или COMPLEX * 16 , КОМПЛЕКС ([KIND =] 16) или COMPLEX * 32 – syscreat

+0

@syscreat Я не рассматривал реальные и сложные в этом ответе, потому что есть отдельный вопрос о них. Здесь я обратился к целому числу. См. Ссылку и ответ. Тот факт, что реальный и сложный из одной и той же точности имеет одно и то же число, вытесняется стандартом. –

 Смежные вопросы

  • Нет связанных вопросов^_^