swift – 如何将UInt64转换为Int64?
发布时间:2020-12-14 05:43:45 所属栏目:百科 来源:网络整理
导读:试图在Swift中调用dispatch_time正在努力,这就是为什么: dispatch_after(dispatch_time(DISPATCH_TIME_NOW,10 * NSEC_PER_SEC),dispatch_get_main_queue(),{ doSomething() }) 导致错误:“无法找到接受提供的参数的’*’的重载”. NSEC_PER_SEC是一个UInt6
试图在Swift中调用dispatch_time正在努力,这就是为什么:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW,10 * NSEC_PER_SEC),dispatch_get_main_queue(),{ doSomething() }) 导致错误:“无法找到接受提供的参数的’*’的重载”. NSEC_PER_SEC是一个UInt64,因此可以进行一些实验: let x:UInt64 = 1000 let m:Int64 = 10 * x 导致与上述相同的错误 let x:UInt64 = 1000 let m:Int64 = 10 * (Int64) x 结果“一行上的连续陈述必须以’;’分隔” let x:UInt64 = 1000 let m:Int64 = 10 * ((Int64) x) 结果“预期”,“分隔符” let x:UInt64 = 1000 let m:Int64 = (Int64)10 * (Int64) x 结果“一行上的连续陈述必须以’;’分隔” 等等 该死的Swift编译器,我放弃了.如何将UInt64转换为Int64,和/或如何在swift中使用dispatch_time?
将UInt64转换为Int64是不安全的,因为UInt64的数字可能大于Int64.max,这将导致溢出.
这是一个用于将UInt64转换为Int64的片段,反之亦然: // Extension for 64-bit integer signed <-> unsigned conversion extension Int64 { var unsigned: UInt64 { let valuePointer = UnsafeMutablePointer<Int64>.allocate(capacity: 1) defer { valuePointer.deallocate(capacity: 1) } valuePointer.pointee = self return valuePointer.withMemoryRebound(to: UInt64.self,capacity: 1) { $0.pointee } } } extension UInt64 { var signed: Int64 { let valuePointer = UnsafeMutablePointer<UInt64>.allocate(capacity: 1) defer { valuePointer.deallocate(capacity: 1) } valuePointer.pointee = self return valuePointer.withMemoryRebound(to: Int64.self,capacity: 1) { $0.pointee } } } 这简单地将UInt64的二进制数据解释为Int64,即大于Int64.max的数字将是负的,因为64位整数的最高位的符号位. 如果你只想要正整数,那就得到绝对值. 编辑:根据行为,您可以获得绝对值,或: if currentValue < 0 { return Int64.max + currentValue + 1 } else { return currentValue } 后一种选择类似于剥离符号位.例如: // Using an 8-bit integer for simplicity // currentValue 0b1111_1111 // If this is interpreted as Int8,this is -1. // Strip sign bit 0b0111_1111 // As Int8,this is 127. To get this we can add Int8.max // Int8.max + currentValue + 1 127 + (-1) + 1 = 127 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- ruby-on-rails – 如何避免Rspec共享示例’先前定义的’警告
- c# – 程序冻结 – 没有错误,没有例外
- XML理解, XML与ini比较
- 正则判断是否包含字母、数字、下划线、减号
- ruby-on-rails-4 – Heroku Apartment PG ::错误:错误:函
- 安装 ORACLE GRID 没有显示ASM 磁盘列表
- .net – 将多个数组聚合成一个数组(Linq)
- 什么时候是C终止处理程序Right Thing(TM)?
- JMeter学习-009-JMeter 后置处理器实例之 - 正则表达式提取
- React Navigation--Stack Navigator and Tab Navigator联合