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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Clemens (Gast)


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?

von Ralf (Gast)


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

von crazy horse (Gast)


Lesenswert?

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

von Clemens (Gast)


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!

von lemmz (Gast)


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;

von lemmz (Gast)


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]
  • [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.