Swift: 这个数学函数有什么问题?
Swift: What's wrong with this math function?
我正在尝试使用此 Unixtime 值创建一个变量,但出现 EXC_BAD_INSTRUCTION
错误。我真的不知道为什么!
func Unixtime()->Int {
return Int(NSDate().timeIntervalSince1970)
}
print((Unixtime()+2)*2)
它可以在 Playground 上运行,但是 运行 如果我将它放在任何项目中都无法运行!
怎么了?
是因为整数溢出
结果值接近 2926042746
,其中 Int32.max
是 2147483647
。所以如果你在 32 位应用程序中 运行 这个,它会溢出并导致 EXC_BAD_INSTRUCTION
.
解决方案是使用 UInt64
或 Double
这是可靠地重现此错误的代码
func Unixtime()->Int32 {
return (NSDate().timeIntervalSince1970)
}
print((Unixtime()+2)*2)
Int
的大小在32位平台上是32位的(例如iPhone5及以下),但现在的时间戳在0x57300000
范围内,这将乘以2肯定会溢出。在Swift算术溢出会导致程序崩溃。
如果您不需要输出为整数,您可以强制输出为 Int64,或者只是 return a TimeInterval
(a Double
)。
// swift 3
func Unixtime() -> TimeInterval {
return Date().timeIntervalSince1970
}
// swift 2
func Unixtime() -> NSTimeInterval {
return NSDate().timeIntervalSince1970
}
print((Unixtime() + 2) * 2)
我正在尝试使用此 Unixtime 值创建一个变量,但出现 EXC_BAD_INSTRUCTION
错误。我真的不知道为什么!
func Unixtime()->Int {
return Int(NSDate().timeIntervalSince1970)
}
print((Unixtime()+2)*2)
它可以在 Playground 上运行,但是 运行 如果我将它放在任何项目中都无法运行! 怎么了?
是因为整数溢出
结果值接近 2926042746
,其中 Int32.max
是 2147483647
。所以如果你在 32 位应用程序中 运行 这个,它会溢出并导致 EXC_BAD_INSTRUCTION
.
解决方案是使用 UInt64
或 Double
这是可靠地重现此错误的代码
func Unixtime()->Int32 {
return (NSDate().timeIntervalSince1970)
}
print((Unixtime()+2)*2)
Int
的大小在32位平台上是32位的(例如iPhone5及以下),但现在的时间戳在0x57300000
范围内,这将乘以2肯定会溢出。在Swift算术溢出会导致程序崩溃。
如果您不需要输出为整数,您可以强制输出为 Int64,或者只是 return a TimeInterval
(a Double
)。
// swift 3
func Unixtime() -> TimeInterval {
return Date().timeIntervalSince1970
}
// swift 2
func Unixtime() -> NSTimeInterval {
return NSDate().timeIntervalSince1970
}
print((Unixtime() + 2) * 2)