W matematyce o stałym punkcie używam wielu sygnałów 16-bitowych i wykonuję mnożenie 32-bitowych wyników pośrednich. Na przykład:Mnożenie liczby całkowitej bez podpisu i bez znaku
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);
Powiedzmy, że a jest liczbą q14, a następnie c, mają takie samo skalowanie jak b.
To jest w porządku i działa dla arytmetyki niepodpisanej i podpisanej.
Pytanie brzmi: co się stanie, jeśli będę mieszał typy? Na przykład, jeśli wiem, że mnożnik "a" ma zawsze wynosić od 0,0 do 1,0, to kusi, aby uczynić go niepodpisanym int q15, aby uzyskać dodatkowy bit precyzji (i zmienić liczbę zmian na 15). Jednak nigdy nie zrozumiałem, co się stanie, jeśli spróbujesz pomnożyć liczby podpisane i niepodpisane w C i unikniesz tego. W ASM nie przypominam sobie, by istniała wielowarstwowa instrukcja, która działałaby z typami mieszanymi w dowolnej architekturze, więc nawet jeśli C zrobi to, co właściwe, nie jestem pewien, czy wygeneruje wydajny kod.
Czy powinienem kontynuować moją praktykę nie mieszania podpisałem niepodpisane typy w stałym punkcie kodu? A może to działa dobrze?
Ten wpis odpowie na pytanie, co dzieje się podczas mnożenia liczb całkowitych podpisanych i niepodpisanych. http://stackoverflow.com/questions/50605/signed-to-unsigned-conversion-in-c-is-it-always-safe. Krótka odpowiedź brzmi, o ile są one tej samej rangi (rozmiar), podpis jest domyślnie typecast unsigned. –
Zamieść odpowiedź zamiast komentarza, więc mogę ją zaakceptować ;-) – phkahler
Z jakiegoś powodu w tamtym czasie myślałem, że odpowiadam tylko na część twojego pytania, więc zostawiłem to jako komentarz. Teraz, kiedy znów patrzę, nie jestem pewien, dlaczego tak pomyślałem. Dzięki! –