Probleme beim rechnen mit dem Vorzeichen

Gast #98926
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?
Gast #98927
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
Gast #98930
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;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren