www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme beim rechnen mit dem Vorzeichen


Autor: Clemens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ich will eine Variable (unsigned char zeitH) die größer ist als
127 am LCD Display ausgeben. Ich verwende dafür folgenden Code:

hundert=zeitH/100;
zehn=(zeitH-hundert*100)/10;
einser=(zeitH-hundert*100-zehn*10);

Dazu wird immer 48 addiert für ascii.
Wenn die Zahl kleiner als 127 ist, dann ist es kein Problem
Ist Sie größer werden z.B für 128 /.( ausgegeben.
=> vermutlich ein Problem mit dem Vorzeichen.

Wie kann ich das einfach umgehen?

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

könnte man das ganze nicht auch mit Subtraktionen machen? So z.B.:

1. Solange 100 abziehen, wie zeitH >= 100 und hundert inkrementieren
2. Solange 10 abziehen, wie zeitH >= 10 und zehn inkrementieren
3. einser = Rest

Das ganze ist denke ich auch schneller als die Lösung mit Divisionen
und Multiplikationen. Aber vielleicht gibt es auch noch elegantere
Lösungen.

Viele Grüße,

Ralf


www.ralf-hochhausen.de

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hundert=zeitH/100 | 0x30;
zeitH=zeitH%100;
zehner=zeitH/10 | 0x30;
einer=zeitH%10 | 0x30;

Autor: Clemens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo danke für die Beiträge aber jetzt kommen nur noch komische Zeichen
wenn ich die Variablen als integer verwende dann funktionierts! Ist
allerdings nicht gerade elegant!

Autor: lemmz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
divisionen sind zumindest bei x86 richtige zeitfresser, modulos um ein
vielfaches mehr. wie das aber beim avr ist weiss ich nicht... ich
persönlich favorisiere ralf's lösung.
vorzeichen: teste das MSb und bilde das 2erkomplement falls MSb
gesetzt.
also:
hunderter=zehner=0;

if( zeitH > 127 ) {
    //male hier das '-'Zeichen
    zeitH ^= 0xFF;   //zweierkomplement
    zeitH++;         //weil 0 hier -1 bedeutet
}
while( zeitH >= 100 ) zeitH -= (++hunderter)*100;
while( zeitH >= 10) zeitH -= (++zehner)*10;
einser=zeitH;

Autor: lemmz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
axo, damit das ganze funktioniert musst du vermutlich deine variablen
als unsigned byte (!) (also unsigned char) definieren !!!

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.