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中的无符号整数到负整数的主要内容,如果未能解决你的问题,请参考以下文章

c中的无符号整数和整数指针[关闭]

整数的无符号编码和有符号编码

NSDecimalNumber 和大的无符号长长(64 位)整数

如何解决 MS SQL 中不受支持的无符号整数字段类型?

Java不提供无符号整数类型?谢谢

如何在python中将有符号整数转换为无符号整数