# An integer overflow problem

**URL:** <https://fortran-lang.discourse.group/t/an-integer-overflow-problem/2955>\
**Category:** Uncategorized\
**Created:** [March 11, 2022, 10:00am UTC](https://fortran-lang.discourse.group/t/an-integer-overflow-problem/2955 "2022-03-11T10:00:35Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![vmagnin](https://yyz2.discourse-cdn.com/free1/user_avatar/fortran-lang.discourse.group/vmagnin/32/28_2.png) [@vmagnin](https://fortran-lang.discourse.group/u/vmagnin)\
**Post date:** [March 11, 2022, 10:00am UTC](https://fortran-lang.discourse.group/t/an-integer-overflow-problem/2955/1 "2022-03-11T10:00:35Z")

</div>

The following program compiled with gfortran, ifort and ifx is computing correctly `2**31-1` when `n` is declared as `int32` (although I would not have been surprised if it had failed):

```fortran
program main
  use iso_fortran_env
  integer(int32) :: n
  integer :: i

  i = 31
  n = 2**i - 1
  print *, n, kind(n)
end program main

```

```bash
$ gfortran main.f90 && ./a.out
  2147483647 4
$ ifort main.f90 && ./a.out
  2147483647 4
$ ifx main.f90 && ./a.out
  2147483647 4

```

but surprisingly with `integer(int64) :: n`, there is an integer overflow with ifort 2021.5.0 (Ubuntu 21.10):

```bash
$ gfortran main.f90 && ./a.out
           2147483647 8
$ ifort main.f90 && ./a.out
           -2147483649 8
$ ifx main.f90 && ./a.out
            2147483647 8

```

---

<div class="post-metadata">

**Author:** ![Arjen](https://avatars.discourse-cdn.com/v4/letter/a/b9bd4f/32.png) [@Arjen](https://fortran-lang.discourse.group/u/Arjen)\
**Post date:** [March 11, 2022, 10:04am UTC](https://fortran-lang.discourse.group/t/an-integer-overflow-problem/2955/2 "2022-03-11T10:04:59Z")

</div>

The calculation is done with an integer of 4 bytes, so the outcome of 2\*\*31 is too big. Apparently there is something odd going on though.

---

<div class="post-metadata">

**Author:** ![Carltoffel](https://yyz2.discourse-cdn.com/free1/user_avatar/fortran-lang.discourse.group/carltoffel/32/1680_2.png) [@Carltoffel](https://fortran-lang.discourse.group/u/Carltoffel)\
**Post date:** [March 11, 2022, 10:07am UTC](https://fortran-lang.discourse.group/t/an-integer-overflow-problem/2955/3 "2022-03-11T10:07:30Z")

</div>

Can you compile your example with warnings, please? Could be interesting…

---

<div class="post-metadata">

**Author:** ![vmagnin](https://yyz2.discourse-cdn.com/free1/user_avatar/fortran-lang.discourse.group/vmagnin/32/28_2.png) [@vmagnin](https://fortran-lang.discourse.group/u/vmagnin)\
**Post date:** [March 11, 2022, 10:09am UTC](https://fortran-lang.discourse.group/t/an-integer-overflow-problem/2955/4 "2022-03-11T10:09:49Z")

</div>

`gfortran -Wall -Wextra main.f90` prints no warning in both cases.  
Same with `ifort -warn all main.f90`.

And if I don’t use the `i` variable and write directly `2**31 - 1`, only gfortran (version 11.2.0) complains:

```bash
$ gfortran main.f90 && ./a.out
main.f90:7:7:

    7 | n = 2**31 - 1
      | 1
Error: Result of exponentiation at (1) exceeds the range of INTEGER(4)

```

---

<div class="post-metadata">

**Author:** ![interkosmos](https://yyz2.discourse-cdn.com/free1/user_avatar/fortran-lang.discourse.group/interkosmos/32/296_2.png) [@interkosmos](https://fortran-lang.discourse.group/u/interkosmos)\
**Post date:** [March 11, 2022, 10:20am UTC](https://fortran-lang.discourse.group/t/an-integer-overflow-problem/2955/5 "2022-03-11T10:20:03Z")

</div>

```fortran
n = int(2_8**31 - 1)

```

---

<div class="post-metadata">

**Author:** ![vmagnin](https://yyz2.discourse-cdn.com/free1/user_avatar/fortran-lang.discourse.group/vmagnin/32/28_2.png) [@vmagnin](https://fortran-lang.discourse.group/u/vmagnin)\
**Post date:** [March 11, 2022, 10:23am UTC](https://fortran-lang.discourse.group/t/an-integer-overflow-problem/2955/6 "2022-03-11T10:23:58Z")

</div>

With ` n = 2_8**i - 1`, ifort is computing correctly in the int64 case.

---

<div class="post-metadata">

**Author:** ![Carltoffel](https://yyz2.discourse-cdn.com/free1/user_avatar/fortran-lang.discourse.group/carltoffel/32/1680_2.png) [@Carltoffel](https://fortran-lang.discourse.group/u/Carltoffel)\
**Post date:** [March 11, 2022, 10:24am UTC](https://fortran-lang.discourse.group/t/an-integer-overflow-problem/2955/7 "2022-03-11T10:24:33Z")

</div>

You can achieve this without int64:

```auto
n = -((-2)**31 +1)

```

---

<div class="post-metadata">

**Author:** ![msz59](https://avatars.discourse-cdn.com/v4/letter/m/3d9bf3/32.png) [@msz59](https://fortran-lang.discourse.group/u/msz59)\
**Post date:** [March 11, 2022, 2:04pm UTC](https://fortran-lang.discourse.group/t/an-integer-overflow-problem/2955/8 "2022-03-11T14:04:29Z")

</div>

Compare following:

```auto
program main
  use iso_fortran_env
  integer(int32) :: n
  integer :: i

  i = 31
  n = 2**i 
  print *, n, kind(n) ! ==> -2147483648 4
  n = n - 1
  print *, n, kind(n) ! ==> 2147483647 4
end program main

```

It seems double overflow occurring here and the result is expected.

In 64-bit version it is really odd, looks like `ifort` treats the first result (2\*\*31) as 64-bit value of -2147483648, subtracting 1 gives -2147483649

---

<div class="post-metadata">

**Author:** ![vmagnin](https://yyz2.discourse-cdn.com/free1/user_avatar/fortran-lang.discourse.group/vmagnin/32/28_2.png) [@vmagnin](https://fortran-lang.discourse.group/u/vmagnin)\
**Post date:** [March 11, 2022, 2:59pm UTC](https://fortran-lang.discourse.group/t/an-integer-overflow-problem/2955/9 "2022-03-11T14:59:58Z")

</div>

> [@msz59](#):
>
> It seems double overflow occurring here and the result is expected.

Interesting, it explains the results with int32.

With int64, the three compilers now give the same result, but with an overflow on `2**31`:

```bash
$ gfortran main.f90 && ./a.out
          -2147483648 8
          -2147483649 8
$ ifort main.f90 && ./a.out
           -2147483648 8
           -2147483649 8
$ ifx main.f90 && ./a.out
           -2147483648 8
           -2147483649 8

```

---

<div class="post-metadata">

**Author:** ![msz59](https://avatars.discourse-cdn.com/v4/letter/m/3d9bf3/32.png) [@msz59](https://fortran-lang.discourse.group/u/msz59)\
**Post date:** [March 11, 2022, 3:03pm UTC](https://fortran-lang.discourse.group/t/an-integer-overflow-problem/2955/10 "2022-03-11T15:03:48Z")

</div>

Which is perfectly okay
