Swift中的无符号整数到负整数
Posted
技术标签:
【中文标题】Swift中的无符号整数到负整数【英文标题】:Unsigned Int to negative Int in Swift 【发布时间】:2015-10-31 02:35:05 【问题描述】:我正在使用 Pebble 加速度计数据,需要将负整数的无符号表示形式转换为正常数字(例如,请注意前两个)。
[X: 4294967241, Z: 4294967202, Y: 22]
[X: 4294967278, Z: 4294967270, Y: 46]
[X: 4294967274, Z: 4294967278, Y: 26]
[X: 4294967221, Z: 85, Y: 4294967280]
[X: 4294967247, Z: 117, Y: 4294967266]
使用 Objective C 我已经通过简单的[number intValue]
做到了这一点。但是,使用 Swift 我找不到这样做的方法。我试过Int(number)
,但我得到了相同的值。
【问题讨论】:
我读的是无符号负整数吗?您也可以只使用 abs 来获取 Int 的绝对值。 一个无符号负数不存在,你的意思是负符号可能吗? 您能否添加更多您获得的值的示例?还有这些值的类型是什么? UInt32?整数32? Int16? @Kametrixom 负数的无符号表示。我已经用更多值更新了帖子。 X 和 Y 值的类型是什么?? 【参考方案1】:您是否只是想将负数的无符号表示转换为其有符号表示?如果是这样,这应该有效:
let negativeValue = Int((incomingValue - 0xffffffff) % 0xffffffff)
【讨论】:
%
的优先级高于-
,我认为你需要一些括号
那不行,它只会把我所有的价值观都变成负数。
@MartiSerraVivancos 也许这些值是负数??
@Kametrixom 并非所有人都是。该代码将正数转换为负数,将负数的无符号表示转换为大的负整数。像这样:[X:-4294967009,Z:-4294967262,Y:-112]【参考方案2】:
如果您收到错误的类型,您可以随时发送unsafeBitcast
:
unsafeBitCast(UInt32(4294967009), Int32.self) // -287
例如,这会将UInt32
转换为Int32
编辑:vacawama 展示了一个更好的解决方案,没有讨厌的unsafe
:
Int32(bitPattern: 4294967009)
非常感谢!改用这个,它很安全(显然)并且可能更快
【讨论】:
也可以用Int32(bitPattern: 4294967009)
来完成,它没有那个讨厌的unsafe
字。 :-)【参考方案3】:
您可以在构造函数中使用bitPattern
将无符号转换为有符号:
let x = Int32(bitPattern: 4294967009)
print(x) // prints "-287"
或者如果您的值已经存储在变量中:
let x: UInt32 = 4294967241
let y = Int32(bitPattern: x)
print(y) // prints "-55"
如果你的值存储为64位的UInt
,转换为Int32
时需要使用truncatingBitPattern
:
let x: UInt = 4294967241
let y = Int(Int32(truncatingBitPattern: x))
print(y) // prints "-55"
【讨论】:
以上是关于Swift中的无符号整数到负整数的主要内容,如果未能解决你的问题,请参考以下文章