Signé & unsigned integer multiplication

En point fixe maths j'ai utiliser beaucoup de 16bit de signaux et d'effectuer une multiplication avec 32 bits de résultats intermédiaires. Par exemple:

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);

Permet de dire que a est un q14 numéro c ont la même échelle que la b.

C'est très bien et fonctionne non signés, ainsi que de l'arithmétique signée.

La question est: Qu'advient-il si je ont été de mélanger les types? Par exemple, si je sais que le coefficient "a" est toujours d'aller à la plage de 0,0 à 1,0, il est tentant d'en faire un unsigned int q15 à obtenir le plus de bits de précision (et de changer le décalage à 15). Cependant, je n'ai jamais compris ce qui se passe si vous essayez de multiplier signés et non signés numéros en C et l'ont évité. En ASM, je ne me souviens pas qu'il y ait un multiplier instruction de travail avec un mélange de types sur n'importe quelle architecture, de sorte que même si C fait la bonne chose, je ne suis pas sûr qu'il pourrait générer un code efficace.

Dois-je continuer ma pratique de ne pas mélanger signé un unsigned types de point fixe code? Ou cela peut-il fonctionner correctement?

Ce post va répondre vous êtes à la question de savoir ce qui se passe lors de la multiplication des entiers signés et non signés. stackoverflow.com/questions/50605/.... Réponse courte est, aussi longtemps qu'ils sont au même rang (taille), un document signé est implicitement transtypage non signé.
Poster une réponse au lieu d'un commentaire afin que je puisse l'accepter 😉
Pour quelque raison, à l'époque, je pensais que je ne faisais que répondre à une partie de votre question, alors je l'ai laissé un commentaire. Maintenant que je regarde à nouveau, je ne sais pas pourquoi j'ai pensé que. Merci!

OriginalL'auteur phkahler | 2013-06-06