2013-06-06 25 views
5

Nella matematica a punto fisso uso molti segnali a 16 bit ed eseguo la moltiplicazione con risultati intermedi a 32 bit. Ad esempio:Moltiplicazione con segno e senza segno

int16_t a = 16384; //-1.0q14 or 1.0*2^14 
int16_t b = -24576; // -1.4q14 or 1.4*2^14 
int16_t c; // result will be q14 

c = (int16_t)(((int32_t)a * (int32_t)b)>>14); 

Diciamo che a è un numero q14 quindi c con lo stesso ridimensionamento di b.

Questo va bene e funziona per l'aritmetica non firmata così come firmata.

La domanda è: cosa succede se dovessi mixare tipi? Ad esempio, se so che il moltiplicatore "a" va sempre da 0.0 a 1.0, è allettante renderlo un q15 unsigned int per ottenere il bit di precisione in più (e cambiare il numero di turni a 15). Tuttavia, non ho mai capito cosa succede se si tenta di moltiplicare i numeri con segno e senza segno in C e di averlo evitato. In ASM non ricordo che ci fosse un'istruzione moltiplicata che avrebbe funzionato con tipi misti su qualsiasi architettura, quindi anche se C fa la cosa giusta non sono sicuro che genererebbe codice efficiente.

Devo continuare la mia pratica di non mischiare i tipi firmati senza segno nel codice punto fisso? O può funzionare bene?

+2

Questo post risponderà alla domanda su cosa succede quando si moltiplicano interi con segno e senza segno. http://stackoverflow.com/questions/50605/signed-to-unsigned-conversion-in-c-is-it-always-safe. La risposta breve è che, purché abbiano lo stesso grado (dimensione), un firmatario è implicitamente tipizzato a non firmato. –

+0

Invia una risposta invece di un commento, quindi posso accettarlo ;-) – phkahler

+0

Per qualche motivo, al momento, pensavo di rispondere solo a una parte della tua domanda, quindi l'ho lasciato come commento. Ora che guardo di nuovo, non sono sicuro del motivo per cui l'ho pensato. Grazie! –

risposta

5

This post Parla di cosa succede quando si moltiplicano numeri interi con segno e senza segno. La risposta breve è che, purché abbiano lo stesso grado (dimensione), un firmatario è implicitamente tipizzato a non firmato.

Fintanto che comprendi le regole di typecasting (di qualsiasi lingua tu stia programmando), o usi typecasting esplicito, e capisci anche le implicazioni di typecasting da firmato a non firmato (un numero negativo produrrà ciò che potrebbe apparire come incomprensibile quando è convertito in un valore firmato), non dovrebbe esserci alcun problema nel mescolare i tipi firmati e non firmati.

+0

Nel mio caso, i tipi di miscelazione daranno risultati errati in base alle regole. Ed è quello di cui avevo paura. – phkahler

+1

Puoi modificare il tuo post in alto con i valori esatti che stai imputando in aeb che generano risultati che vanno contro le regole? –