2014-07-20 2 views
1

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

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) но безрезультатно. Любые рекомендации?

ответ

2

Это почти дубликат this recent question так что я, вероятно, следует голосовать, чтобы закрыть, но здесь идет, опять

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

n = 2_long**31_long 

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

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