www.mikrocontroller.net

Forum: Compiler & IDEs Überlauf durch Multiplikation von zwei char vermeiden?


Autor: Ra (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tach, mal ne doofe Frage:

was ergibt 0xFF mal 0xFF ? Castet GCC und es ist FE01 ? Wie kann ich das
Ergebnis auf 0xFF begrenzen?

Autor: mr.chip (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Ra (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Detlev T. (detlevt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
if(c & 0xff00) c=0xff;

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: A. F. (artur-f) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So in der Art:
#define MULT(a, b)  ((a * b & 0xFF00) ? (a * b) : 0)

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
static inline unsigned char umul8x8_sat8 (unsigned char a, unsigned char b)
{
    unsigned short ab = a*b;
    return (ab & 0xff00) ? 0xff : ab;
}

Im Gegensatz zu einem Makro hat das keine Nebeneffekte, gibt aber je 
nach Kontext etwas schlechteren Code.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.