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?
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. –
Invia una risposta invece di un commento, quindi posso accettarlo ;-) – phkahler
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! –