签名的十六进制签名Int Swift

时间:2015-07-09 17:02:06

标签: ios iphone swift

我已经看到很多将hex转换为int的问题,但这些都是unsigned->未签名的品种。如何将带符号的十六进制转换为Int?

例如。

somefunc('0xfffff830')
= -2000

3 个答案:

答案 0 :(得分:5)

您的问题暗示您正在处理32位有符号整数 (否则0xfffff830不能被视为否定), 所以这会奏效:

let num = "0xfffff830"

let x = Int32(truncatingBitPattern: strtoul(num, nil, 16))
println(x) // -2000

strtoul()将十六进制字符串转换为无符号整数UInt,并且 Int32(truncatingBitPattern:)创建一个(带符号的)32位整数 从给定参数的最低32位开始。

针对 Swift 4:

进行了更新
let num = "0xfffff830"
let x = Int32(bitPattern: UInt32(num.dropFirst(2), radix: 16) ?? 0)
print(x) // -2000

答案 1 :(得分:2)

您可以使用转换为无符号,然后将unsigned转换为signed。

let num = "0xfffff830"
var result: UInt32 = 0
let converter = NSScanner(string: num)
converter.scanHexInt(&result)

print(unsafeBitCast(result, Int32.self)) // prints -2000

答案 2 :(得分:1)

方法

var hex = UInt32(0xfffff830)
let signedHex : Int
if hex > UInt32.max / 2 {
  signedHex = -Int(~hex + 1) // ~ is the Bitwise NOT Operator
} else {
  signedHex = Int(hex)
}