Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Converting signed to unsigned in Swift

In C, I am able to do a trick with numbers:

uint8_t value = 0
int delta = -1
uint8_t result = value + delta  /* result will be 0xFF */

Is there a way of doing the same in Swift? Notice that the same approach doesn't work:

let value: UInt8 = 0
let delta: Int = -1
var result: UInt8 = value + delta  // Error, even typecasting in different ways... 

Is there a way to get C's behaviour for substraction in Swift?

Thanks!

like image 933
George Avatar asked Sep 04 '14 13:09

George


2 Answers

All signed and unsigned integer types have a bitPattern: constructor, which creates an unsigned number from a signed (or vice versa) with the same memory representation:

let delta: Int8 = -1
let result: UInt8 = UInt8(bitPattern: delta) // 0xFF = 255
like image 185
Martin R Avatar answered Oct 26 '22 16:10

Martin R


(I think your example is a little off. 0 - -1 is 1. I believe this answer is what you were thinking of, though).

You want to opt-into overflow with the &- operator:

let value: UInt8 = 0
let delta: UInt8 = 1
let result: UInt8 = value &- delta

There are similar things you can do with the other & operators like &+, &*, etc. There's even a &/ that handles divide by zero.

like image 6
Rob Napier Avatar answered Oct 26 '22 18:10

Rob Napier