我在使用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)

请参阅How can I generate large, ranged random numbers in Swift?以获取避免的可能解决方案
生成任意范围的随机数时溢出。

关于ios - 从UInt32转换为Int时溢出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32075019/

10-12 03:17