2015-07-09 3 views
2

Я видел много вопросов, преобразующих hex в int, но это все беззнаковое -> unsigned разновидность. Как я могу конвертировать подписанный hex в Int?Подпись Hex to Signed Int Swift

например.

somefunc('0xfffff830') 
= -2000 

ответ

4

Ваш вопрос подразумевает, что вы имеете дело с 32-битными целыми числами (в противном случае 0xfffff830 не могут рассматриваться как отрицательные), так это будет работать:

let num = "0xfffff830" 

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

strtoul() преобразует шестнадцатеричную строку в целое число без знака UInt и Int32(truncatingBitPattern:) создает 32-битовое целое (подписанное) из младших 32 бит данного аргумента.

+0

Это ручка как подписанная, так и неподписанная и хороша и коротка, спасибо! – John

2

Вы можете использовать преобразование без знака, а затем преобразовать знак без знака в подпись.

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

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

Спасибо! это обрабатывает как положительные, так и отрицательные значения и является другим решением. – John

+0

Также хорошее решение, я бы предпочел только 'Int32 (битPattern: result)' over 'unsafeBitCast (...)'. –

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) 
} 
+0

К сожалению, это не касается положительного диапазона – John

+0

Я отредактировал сообщение, чтобы исправить его – vadian