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


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 !!!

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
Noch kein Account? Hier anmelden.