关于Objective C:在Swift中将Unsigned Int转换为负Int

Unsigned Int to negative Int in Swift

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


如果输入了错误的类型,则始终可以执行unsafeBitcast

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

例如,将UInt32转换为Int32

编辑:vacawama在没有讨厌的unsafe

的情况下显示了更好的解决方案

1
Int32(bitPattern: 4294967009)

非常感谢!改用它,这是安全的(显然),并且可能更快。


您可以在构造函数中使用bitPattern将未签名转换为已签名:

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

或者如果您的值已经存储在变量中:

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

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

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

您是否只是在尝试将负数的无符号表示转换为它的带符号表示?如果是这样,这应该可以工作:

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