当前位置: 首页 > 面试题库 >

为什么以下代码在iPhone 5而不是iPhone 5S上崩溃?

狄新翰
2023-03-14
问题内容
func rand(max: Int?) -> Int {
    var index = Int(arc4random())
    return max? != nil ? (index % max!) : index
}

我在最后一行遇到异常: EXC_BAD_INSTRUCTION

我猜这与iPhone 5S是64位而iPhone 5S不是64位有关,但是我在上面的函数中看不到任何处理64位的东西吗?

编辑

通过以下调整,我可以解决此问题,但是我仍然无法解释原因。

func rand(max: Int?) -> Int {
    var index = arc4random()
    return max? != nil ? Int(index % UInt32(max!)) : Int(index)
}

问题答案:

Int整数类型是在iPhone 5 32位整数,在一个5S
64位整数。由于arc4random()返回的UInt32值是IntiPhone 5
的正范围的两倍,因此您的第一个版本基本上有50%的机率在此行崩溃:

var index = Int(arc4random())

修改后的版本将等待转换,直到您使用取模和为止max,因此可以安全地转换到Int那里。您应该检出arc4random_uniform,它为您处理模并避免当前实现中固有的偏差。



 类似资料:
  • 我想了两个小时,为什么这段代码不能产生预期的结果。如果我输入3个整数,比如3、4和5,它应该给出所有27个可能的和(假设数字可以是正的、负的或零) 因此,它应该产生以下内容: -3-4-5=-12 -3-4 0 = -7 -4-4 5=3 等等

  • 如果(新名称) 我可以理解在vanillaJS中检查newName是否真实,但在Typescript中,这是为了什么?Typescript已经保证newName是string,并且它具有。长度属性。 完整代码在这里:https://www.typescriptlang.org/docs/handbook/classes.html

  • 问题内容: 为什么这样 代替这个 问题答案: 因为如果抛出异常,则 除非 捕获到异常, 否则 在执行 该块之后没有任何代码。一个块总是执行,不管你里面发生了什么块。 __

  • 问题:为什么我们希望BUILD-MAX-HEAP第2行中的循环索引<code>i到,而不是从增加到 和< code>A[3]是max-heaps的根。

  • 问题内容: 输出显示FirstThread始终在SecondThread之前运行,这与我阅读的文章相反。 为什么?第一个线程必须在第二个线程之前运行?如果没有,您能给我一个很好的例子吗?谢谢。 问题答案: 使用开始不运行 如果使用run方法,则调用第一个方法,然后调用第二个方法。如果要运行并行线程,则必须使用线程的启动方法。

  • 以下代码中的“-97”是什么意思? 我们创建了一个由26个LinkedList组成的数组来模拟字典。每个列表包含以“a”、“b”、“c”、......“z”开头的所有单词。代码是由讲师给出的。 这里是附注: 在特定MyLinkedList中搜索单词的步骤 假设要搜索的单词位于名为wordstr的String类型变量中。 将允许您跳转到正确的链接列表,并且包含将返回true/false,这取决于单词