Swift中将无符号整数转换为负整数

4
我正在处理Pebble加速度计数据,需要将负整数的无符号表示转换为正常数字(例如第一个和第二个)。使用Objective C,我通过简单的[number intValue]实现了这一点。然而,使用Swift,我找不到方法。我尝试了Int(number),但是得到了相同的值。

我是否正确读取了无符号负整数?您也可以使用abs来获取Int的绝对值。 - Fred Faust
无符号负数不存在,您是指有符号的负数吗? - Kametrixom
你能添加更多获取值的示例吗?还有这些值的类型是什么?UInt32?Int32?Int16? - Kametrixom
@Kametrixom 无符号表示负数。我已经更新了帖子并添加了更多的值。 - Marti Serra Vivancos
X和Y的类型是什么? - Kametrixom
显示剩余4条评论
3个回答

5

如果您收到了错误的类型,您始终可以执行unsafeBitcast

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

例如,这将一个 UInt32 转换为 Int32

编辑:vacawama 展示了一种更好的解决方案,而不需要使用不安全的 unsafe

Int32(bitPattern: 4294967009)

非常感谢!请使用这个替代品,它很安全(显然),并且可能更快。

2
可以使用Int32(bitPattern: 4294967009)来完成,这样就不需要使用那个讨厌的unsafe关键字了。 :-) - vacawama

4
您可以在构造函数中使用bitPattern将无符号数转换为有符号数:
let x = Int32(bitPattern: 4294967009)
print(x)  // prints "-287"

如果您的值已经存储在变量中: ```html

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

```
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"

0

你是想将一个负数的无符号表示转换为有符号表示吗?如果是,这个方法应该可以:

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

1
百分号(%)的优先级高于减号(-),我觉得你需要加上一些括号。 - Kametrixom
这不起作用,它只是把我所有的值变成了负数。 - Marti Serra Vivancos
@MartiSerraVivancos 或许这些值是负数吗? - Kametrixom
@Kametrixom 并非所有的数字都是如此。该代码将正数转换为负数,并将负数的无符号表示转换为大的负整数。就像这样:[X: -4294967009,Z: -4294967262,Y: -112] - Marti Serra Vivancos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接