Swigned中的无符号Int到负Int

时间:2015-08-07 15:20:09

标签: objective-c swift int unsigned

我正在使用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),但我获得了相同的价值。

3 个答案:

答案 0 :(得分:5)

如果收到错误的类型,您总是可以unsafeBitcast

unsafeBitCast(UInt32(4294967009), Int32.self)  // -287

例如,将UInt32转换为Int32

编辑:vacawama显示了一个更好的解决方案,没有讨厌的unsafe

Int32(bitPattern: 4294967009)

非常感谢!使用这个,它是安全的(显然),可能更快

答案 1 :(得分:3)

您可以在构造函数中使用bitPattern将unsigned转换为signed:

let x = Int32(bitPattern: 4294967009)
print(x)  // prints "-287"

或者您的值是否已存储在变量中:

let x: UInt32 = 4294967241
let y = Int32(bitPattern: x)
print(y)  // prints "-55"

如果您的值存储为64位UInt,则转换为truncatingBitPattern时需要使用Int32

let x: UInt = 4294967241
let y = Int(Int32(truncatingBitPattern: x))
print(y)  // prints "-55"

答案 2 :(得分:0)

您是否只是想将负数的无符号表示转换为其已签名的表示形式?如果是这样,这应该有效:

let negativeValue = Int((incomingValue - 0xffffffff) % 0xffffffff)