关于int类型转换的错误指令而不是Swift中的溢出

时间:2015-10-10 18:33:18

标签: xcode swift type-conversion semantics

在Swift游乐场中,我写了这一行,结果在大多数情况下会溢出:

var ran = UInt8(arc4random())

我确实认识到一种更合适的方法是掩盖低位或采用mod,但这与我的问题无关。发生的情况是,系统会尝试运行代码并产生EXC_BAD_INSTRUCTION错误,而不是出现错误并注意到溢出(至少是警告?)。我是否忽视了某些内容,或者这是Swift执行的语义分析中的错误?

这是使用Xcode版本7.0.1

(稍后编辑:这个问题与a similar one的不同之处在于它是一个更简单的上下文(仅存储,而不是算术运算),没有运算符如& +表示溢出是但是,所发布的答案是全面的,并且感谢!)

1 个答案:

答案 0 :(得分:2)

您可以从arc4random获取一个随机字节,如下所示:

var num: UInt8 = 0
arc4random_buf(&num, sizeofValue(num))

但你的问题是错误的原因。如the documentation中所述,常规数字运算符和初始值设定项执行溢出检查并在运行时抛出错误:

您可以使用overflow operators &+&-&*对相同类型的数字执行带有溢出的操作。< / p>

或者您可以使用IntegerArithmeticType protocol

中的这些静态函数
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