在Swift游乐场中,我写了这一行,结果在大多数情况下会溢出:
var ran = UInt8(arc4random())
我确实认识到一种更合适的方法是掩盖低位或采用mod,但这与我的问题无关。发生的情况是,系统会尝试运行代码并产生EXC_BAD_INSTRUCTION错误,而不是出现错误并注意到溢出(至少是警告?)。我是否忽视了某些内容,或者这是Swift执行的语义分析中的错误?
这是使用Xcode版本7.0.1
(稍后编辑:这个问题与a similar one的不同之处在于它是一个更简单的上下文(仅存储,而不是算术运算),没有运算符如& +表示溢出是但是,所发布的答案是全面的,并且感谢!)
答案 0 :(得分:2)
您可以从arc4random
获取一个随机字节,如下所示:
var num: UInt8 = 0
arc4random_buf(&num, sizeofValue(num))
但你的问题是错误的原因。如the documentation中所述,常规数字运算符和初始值设定项执行溢出检查并在运行时抛出错误:
您可以使用overflow operators 或者您可以使用IntegerArithmeticType protocol: 最后,有&+
,&-
和&*
对相同类型的数字执行带有溢出的操作。< / p>
public static func addWithOverflow(lhs: Self, _ rhs: Self) -> (Self, overflow: Bool)
public static func subtractWithOverflow(lhs: Self, _ rhs: Self) -> (Self, overflow: Bool)
public static func multiplyWithOverflow(lhs: Self, _ rhs: Self) -> (Self, overflow: Bool)
public static func divideWithOverflow(lhs: Self, _ rhs: Self) -> (Self, overflow: Bool)
public static func remainderWithOverflow(lhs: Self, _ rhs: Self) -> (Self, overflow: Bool)
init(bitPattern:)
和init(truncatingBitPattern:)
复制/截断原始位:Int32(bitPattern: arc4random()) // types of the same size
UInt8(truncatingBitPattern: arc4random()) // types of different size