gfortran错误:整数太大了(1)

时间:2016-01-24 05:19:27

标签: fortran gfortran

我希望看到整数种类的gfortran

所以我写了这一行

write(*,"(1X,I20,'correspond to kind  ',I2)"),11111111111,kind(11111111111)

会出现编译错误

  

类型test.f90的精度:67:57:错误:整数太大了   在(1)。可以使用选项-fno-range-check

禁用检查

所以我尝试用-fno-range-check重新编译。但它给出了结果

  

-1773790777对应于第4类

有什么问题?另一方面,英特尔fortran没有给出任何错误和正确答案

2 个答案:

答案 0 :(得分:4)

无论您输入什么值 1 ,没有任何类型指定的整数文字始终是默认类型。因此,甚至没有意义询问

kind(1)

任何此类文字的类型始终是默认类型,前提是该值有效。与write(*,*) HUGE(1) 相同。

所有整数种类的值都有限。您可以使用

获得的最大的一个
1

此处代替HUGE,您可以使用您检查的整数种类的任何其他常量或变量。通常,2147483647的默认值为integer, parameter :: lk = selected_int_kind(15) write(*,*) 11111111111_lk ,对应于32位整数。

要使用更大的整数文字常量,请使用更大的非默认类型。

使用Fortran 90中的方法无关紧要:

use iso_fortran_env

integer, parameter :: lk = int64

write(*,*) 11111111111_lk

或来自Fortran 2008

kind(11111111111_lk)

两者都有效。当然lk会返回let url = "https://httpbin.org/stream/100" // this is for example.. let destination = Alamofire.Request.suggestedDownloadDestination(directory: .DocumentDirectory, domain: .UserDomainMask) Alamofire.download(.GET, url, parameters: params, encoding: ParameterEncoding.URL,destination:destination) .progress { bytesRead, totalBytesRead, totalBytesExpectedToRead in // This closure is NOT called on the main queue for performance // reasons. To update your ui, dispatch to the main queue. dispatch_async(dispatch_get_main_queue()) { // Here you can update your progress object print("Total bytes read on main queue: \(totalBytesRead)") print("Progress on main queue: \(Float(totalBytesRead) / Float(totalBytesExpectedToRead))") } } .response { request, _, _, error in print("\(request?.URL)") // original URL request if let error = error { let httpError: NSError = error let statusCode = httpError.code } else { //no errors let filePath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] print("File downloaded successfully: \(filePath)") } }

的值

1 这是标准的Fortran。有些编译器可能会为您提供更大的值,但仅作为非标准扩展。在转移到保持标准行为的编译器时,您可能会感到非常惊讶。

答案 1 :(得分:2)

可能有更好的解释,但这就是我理解它的方式。简短的回答是编译器默认为4字节整数。

Fortran是静态类型的,您还没有声明变量类型。编译器被强制使用默认的整数种类,在这种情况下为4个字节。 kind函数只返回使用的整数'种类'。编译器告诉您,您正在尝试为4字节整数分配一个太大的值。当您应用-fno-range-check时,编译器忽略此事实并且值溢出,因此返回负值。您可以指定默认整数类型为8个字节-fdefault-integer-8。请参阅gfortran docs

示例foo.f90:

program foo
    write(*,"(1X,I20,' correspond to kind  ',I2)"),111111111111,kind(111111111111)
    write(*,"(1X,I20,' correspond to kind  ',I2)"),11,kind(11)
end program foo

编译:

$ gfortran -fdefault-integer-8 -o foo.exe foo.f90
$ foo

结果:

  

111111111111对应种类8
  11对应于种类8

所以你可以看到编译器对你正在测试的实际值无动于衷。

但是,我不认为这是你想要做的事情的根源,我假设是发现特定数值所需的最小整数大小。我不知道有办法与fortran一起做这件事。有关您可能从C端口解决的解决方案,请参阅此herehere。第二种方法看起来很有希望。在像Python这样的动态类型语言中,为您处理类型分配。

>>> type(111111111111)
<type 'long'>
>>> type(11111)
<type 'int'>