Tach, mal ne doofe Frage: was ergibt 0xFF mal 0xFF ? Castet GCC und es ist FE01 ? Wie kann ich das Ergebnis auf 0xFF begrenzen?
Was genau willst du tun? Welche Sprache und welcher Prozessor? uint8_t a = 0xFF; uint8_t b = 0xFF; uint8_t c = a * b; Dann hat c einen Wert zwischen 0x00 und 0xFF, und zwar die untersten Bits des eigentlichen Multiplikationsresultat. Oder was willst du genau?
AVR und C (GCC) Genau. Wie erreiche ich, dass c auf 255 begrenzt wird. Muss c als uint16_t initialisiert werden, und manuell bei c > 0xFF c=0xFF gesetzt werden? Ich beantworte mal selber: ja.
Ra wrote:
> Ich beantworte mal selber: ja.
Warum fragst du, wenn du die Antwort schon selber weißt? ;)
Ich sehe da auch keine andere Lösung, sonderlich aufwändig ist sie aber
auch nicht. Ein guter Compiler macht das mit ganz wenigen Befehlen,
ansonsten kann man ihm auch helfen mit:
1 | if(c & 0xff00) c=0xff; |
ich glaube er meint mit auf 0xFF begrenzen, dass es zwischen 0 und 255 ist, und nicht dass es im Überlauffall den Wert 0xFF hat. Du brauchst nix zu tun. unsigned char x = 255*2; // 254 wird schon richtig abschneiden.
So in der Art: #define MULT(a, b) ((a * b & 0xFF00) ? (a * b) : 0)
Ra wrote: > AVR und C (GCC) > > Genau. Wie erreiche ich, dass c auf 255 begrenzt wird. Muss c als > uint16_t initialisiert werden, und manuell bei c > 0xFF c=0xFF gesetzt > werden? Kommt drauf an, was Du mit "begrenzt" meinst. Bei der üblichen Multiplikation wird das Produkt, wie ober erklärt, (implizit) modulo 256 genommen, weil das obere Byte des Produkts in der Tonne landet. Analog zur Addition/Subtraktion. Eine Saturierung kann AVR auf Hardware-Ebene nicht. Wenn das Ergebnis saturiert werden soll, muss das also ausgetextet werden, etwa
1 | static inline unsigned char umul8x8_sat8 (unsigned char a, unsigned char b) |
2 | {
|
3 | unsigned short ab = a*b; |
4 | return (ab & 0xff00) ? 0xff : ab; |
5 | }
|
Im Gegensatz zu einem Makro hat das keine Nebeneffekte, gibt aber je nach Kontext etwas schlechteren Code.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.