Укажите Integer Precision gfortran

Я работаю с целыми числами больше 2^31-1, и поэтому я пытаюсь установить точность моих целочисленных переменных на более высокое значение. Метод, который я считал правильным, был

PROGRAM f1
IMPLICIT NONE

INTEGER,PARAMETER :: LONG = SELECTED_INT_KIND(15)
INTEGER(KIND=LONG) :: n
n=2**31

END PROGRAM f1

что, как я понимаю, должно позволять n быть в [-10^15, 10^15]. Однако приведенный выше код выдает ошибку компилятора, используя gfortran 4.6, а именно

n=2**31
   1
Error: Arithmetic overflow at (1)

Я пытался заменить линию бедствия на n=int8(2**31) но безрезультатно. Любые рекомендации?

1 ответ

Решение

Это почти дубликат этого недавнего вопроса, поэтому я, вероятно, должен проголосовать, чтобы закрыть, но здесь снова

В выражении 2**31 и то и другое 2 а также 31 являются целыми числами по умолчанию, скорее всего, 32-разрядными целыми числами. Компилятор умножит их в соответствии с правилами для 32-разрядных целых чисел и переполнит, прежде чем присваивать результат n, Если это не то поведение, которое вы хотите, либо возитесь с параметрами компилятора (плохая рекомендация), либо четко установите тип для литеральных значений (лучше):

n = 2_long**31_long

(На практике вам не нужно делать оба 2 а также 31long целые числа, но это не вредит.)

Другие вопросы по тегам