2014-09-04 15 views
7

In C, sono in grado di fare un trucco con i numeri:Conversione firmato a non firmato a Swift

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

C'è un modo di fare lo stesso in Swift? Si noti che lo stesso approccio non funziona:

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

C'è un modo per ottenere il comportamento di C per sottrazione a Swift?

Grazie!

risposta

22

Tutti i tipi interi con e senza segno hanno un costruttore bitPattern:, che crea un numero senza segno da una firma (o viceversa) con la stessa rappresentazione memoria:

let delta: Int8 = -1 
let result: UInt8 = UInt8(bitPattern: delta) // 0xFF = 255 
+0

Questo funziona. Grazie! – George

+0

È necessaria solo una correzione, vedo: 'UInt8 (bitPattern: Int8 (delta))' è necessario invece del semplice 'UInt8 (bitPattern: delta)' (o delta deve essere Int8). – George

+0

@ George: hai ragione, corretto. –

6

(Penso che il tuo esempio sia un po 'off. 0 - -1 è 1. Credo che questa risposta sia ciò a cui stavi pensando, però).

Si desidera opt-in di overflow con la &- dell'operatore:

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

Ci sono cose simili che si possono fare con gli altri & operatori come &+, &*, ecc C'è anche un &/ che gestisce dividere per zero.

+0

Oh! Scusa ... Il codice era sbagliato (digitando troppo velocemente ...). È corretto ora. – George

+2

Con il codice di esempio corretto, l'altra risposta funziona meglio, ma questa è comunque un'informazione utile. Grazie! – George