我正在将一个库从 Java (Android) 翻译为 -> Swift (iPhone)
Java代码,工作正常:
long a = 48590108397870l;
short b = ((short)(a & 65535));//b == -28370
Run Code Online (Sandbox Code Playgroud)
SWIFT代码:
let a : Int64 = 48590108397870
let b: Int16 = Int16(a & 65535)//Fatal error: Not enough bits to represent the passed value
Run Code Online (Sandbox Code Playgroud)
Mar*_*n R 10
a & 65535是 0 到 2 16 -1之间的值,适合 an UInt16,但不适合 an Int16。与许多其他语言相反,Swift 不会隐式截断值。
整数有一个init(truncatingIfNeeded:)初始值设定项,可以执行您想要的操作:
\n\n当T(源的类型)的位宽等于或大于该类型\xe2\x80\x99s位宽时,结果是源的截断的最低有效位。
\n
例子:
\nlet a : Int64 = 48590108397870\nlet b = Int16(truncatingIfNeeded: a)\nprint(b) // -28370\nRun Code Online (Sandbox Code Playgroud)\n另一种选择是首先创建一个无符号整数,然后将其转换为具有相同位模式的有符号整数:
\nlet a : Int64 = 48590108397870\nlet b = Int16(bitPattern: UInt16(a & 0xFFFF))\nprint(b) // -28370\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
3088 次 |
| 最近记录: |