从UInt32转换为Int时溢出



我在使用Swift/Xcode时遇到了一个非常奇怪的问题(说实话,我不确定源代码在哪里)。

我必须执行以下代码:

extension Int {
    func random(min : Int = 0, max : Int = Int(UInt32.max - 1)) {
        return min + Int(arc4random_uniform(UInt32(max - min + 1)))
    }
}

当我在Xcode中构建这段代码时,它工作得非常好。当我尝试使用xcodebuild构建它时,编译器给了我以下错误:

integer overflows when converted from 'UInt32' to 'Int'
    public static func random(min : Int = 0, max : Int = Int(UInt32.max - 1)) -> Int {

这很奇怪,因为Int.maxUInt32.max的值并不接近。

我正在使用Xcode 7.0 beta 5进行编译,如果它有任何帮助…因为我完全被难住了

如果编译为32位设备(例如iPhone 5),则会出现该错误,因为Int是一个有符号 32位整数,而UInt32.max - 1在它的范围之外。

另一个问题是UInt32(max - min + 1)的计算,它可能在运行时由于溢出而崩溃,例如,如果调用

random(min : Int.min, max : Int.max)

参见如何在Swift中生成大的、范围的随机数?对于一个可能的解决方案,以避免为任意范围生成随机数时溢出

最新更新