我希望看到整数种类的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没有给出任何错误和正确答案
答案 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端口解决的解决方案,请参阅此here和here。第二种方法看起来很有希望。在像Python这样的动态类型语言中,为您处理类型分配。
>>> type(111111111111)
<type 'long'>
>>> type(11111)
<type 'int'>