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

如何将UInt64转换为Int64?

柳宏深
2023-03-14
问题内容

尝试在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,和/或如何快速使用dispatch_time?


问题答案:

将a强制转换UInt64为an Int64是不安全的,因为a UInt64可以具有大于的数字Int64.max,这将导致溢出。

以下是将转换UInt64Int64,反之亦然的代码段:

// 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 }
    }
}

这只是将二进制数据解释UInt64Int64,即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


 类似资料:
  • 问题内容: 以下代码存在问题: 是,是。在不丢失信息的情况下,在这两种数字类型之间进行转换以使用编码器和解码器的唯一方法是吗? 注意,在您的典型情况下,我不尝试直接进行数值转换。我更关心维护随机数生成器的统计属性。 问题答案: 看到-1与以32位运行的进程一致。 例如,请参阅Go1.1发行说明(已引入) 使用可以帮助您查看发生了什么 事实证明,OP实战程序([在注释中]确认它最初以32位运行(因此

  • 问题内容: 我在mySQL 5.1中有一个数据类型的日期列。如何将其转换为DATE? 这是我到目前为止所拥有的- 得到这个 错误-#1064-您的SQL语法有错误;查看与您的MySQL服务器版本相对应的手册以获取正确的语法,以在’FROM 7 FOR 4附近使用) 请帮忙。 问题答案: 您可以使用MySQL的功能 尽管我怀疑您使用Unix时间戳会更轻松

  • 问题内容: 有没有一种简单的方法可以避免处理文本编码问题? 问题答案: 您确实无法避免处理文本编码问题,但是Apache Commons中已有一些解决方案: 至: 至: 您只需要选择所需的编码即可。

  • 问题内容: 如何使用Java将Dicom文件(.dcm)转换为jpeg图像?这是我的代码: 我在运行项目时遇到以下错误 请帮助并提前感谢 问题答案: 这是使用dcm4che 2将DICOM转换为JPEG的链接 以下是我的代码,效果很好,我将其与导入一起放置,因此可能用完了。 用于运行它的罐子 dcm4che-imageio-2.0.28.jar dcm4che-image-2.0.28.jar j

  • 问题内容: 我正在使用A 将Json从Web转换为字符串。 这可能很简单,但是我似乎无法将此字符串转换为。 我怎样才能做到这一点? 问题答案: 请参阅文档和示例。

  • 问题内容: 如何在Java中将org.jdom.Document转换为字符串? 问题答案: