【问题标题】:Casting UInt16 to Int16 will occur a program crash [duplicate]将 UInt16 转换为 Int16 会发生程序崩溃 [重复]
【发布时间】:2016-02-21 18:30:40
【问题描述】:

当我将 UInt16(超过 32767 的值)转换为 Int16 时,如何避免程序崩溃。

在 Object-C 中既简单又安全:

uint16_t a = 32888
int16_t  b = (int16_t)a

但我对 Swift 没有任何想法。

【问题讨论】:

  • 显然您可以在进行无效转换之前检查范围。
  • 为什么要使用带符号的 16 位整数作为可能结束的值?只需使用更大的数据类型...
  • 因为我必须打开一个定义了 UInt16 格式的文件
  • 我希望引用的线程回答你的问题。在您的情况下,它将是:let a : UInt16 = 32888 ; let b = Int16(bitPattern: a).
  • 谢谢马丁,你为我提供了一种方便的方式

标签: swift


【解决方案1】:

您可以使用以下功能:

func toInt(unsigned: UInt) -> Int {

    let signed = (unsigned <= UInt(Int.max)) ?
        Int(unsigned) :
        Int(unsigned - UInt(Int.max) - 1) + Int.min

    return signed
}

【讨论】:

  • 谢谢!效果很好。
  • numericCast(...) 是您正在寻找的。它是一组通用函数,可以在不同的数字类型之间进行转换。它根据参数的类型和返回类型选择正确的实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-05
  • 2017-07-12
  • 1970-01-01
  • 2016-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多