2013-06-06 18 views
5

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?

+2

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. –

+0

Zamieść odpowiedź zamiast komentarza, więc mogę ją zaakceptować ;-) – phkahler

+0

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! –

Odpowiedz

5

This post Mówi o tym, co dzieje się podczas mnożenia liczb całkowitych ze znakiem i bez znaku. Krótka odpowiedź brzmi, o ile są one tej samej rangi (rozmiar), podpis jest domyślnie typecast unsigned.

Tak długo, jak rozumiesz reguły podawania (niezależnie od języka, w którym programujesz) lub stosujesz jawne typowanie, a także rozumiesz konsekwencje typowania po podpisaniu na niepodpisane (liczba ujemna spowoduje, że będzie wyglądać jak bełkot gdy jest przypisana do podpisanej wartości), nie powinno być problemu z mieszaniem typów podpisanych i niepodpisanych.

+0

W moim przypadku rodzaje miksowania będą skutkować błędnymi wynikami zgodnie z regułami. I tego się bałem. – phkahler

+1

Czy możesz edytować swój wpis powyżej z dokładnymi wartościami, które przypisujesz do aib, które wymyślają wyniki niezgodne z regułami? –

Powiązane problemy