Forum: Compiler & IDEs ultoa-Ausgabe 32-Bit-Zahl seriell


von Roman S. (kadege)


Lesenswert?

Hallo,
stehe auf dem Schlauch bzgl. Ausgabe einer uint32_t auf der seriellen 
Schnittstelle:
1
uint32_t      Ergebnis; 
2
uint16_t      c_2 = 8910;
3
char          s[20];
4
5
int main (void) 
6
  {    
7
  Ergebnis =  (c_2 << 10);
8
  uart_puts(ultoa (Ergebnis , s, 10));
9
  }
10
  
11
void uart_puts (char *s)
12
  {
13
  while (*s)
14
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
15
    uart_putc(*s);
16
    s++;
17
    }
18
  }  
19
  
20
int uart_putc(unsigned char c)
21
  {  
22
  while (!(UCSR0A & (1<<UDRE0)) )            // warten bis Senden moeglich
23
    {
24
    ;
25
    } 
26
  UDR0 = c;                                  // sende Zeichen    
27
    return 0;
28
  }

Es wird 14337 ausgegeben; das muß irgendwas mit der Umwandlung einer 
uint32_t zu tun haben, wenn ich nur c_2 ausgeben lasse, tut es.

Sieht jemand den Fehler?
Danke für hilfreiche Tips!

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

1
Ergebnis = (uint32_t) c_2 << 10;
anstatt
1
Ergebnis =  (c_2 << 10);

von Peter II (Gast)


Lesenswert?

Johann L. schrieb:
> Ergebnis = (uint32_t) c_2 << 10;anstatt
> Ergebnis =  (c_2 << 10);

ich würde sagen:

Ergebnis = ( (uint32_t)c_2) << 10;


denn vor dem shift muss man casten, damit es ein uint32_t wird. Erst 
dann darf man um 10 bit schiften.

von Karl H. (kbuchegg)


Lesenswert?

EIn Cast hat eine höhere Priorität als eine Shift Operation. Damit sind 
die Klammern nicht notwendig, wenn auch sinnvoll, weil sie die Sache für 
den Leser klären.

von Roman S. (kadege)


Lesenswert?

Danke, beide Varianten haben funktioniert. Frage: Wenn die 
Ergebnis-Variable doch als uint32_t deklariert ist, warum muß ich dann 
casten? Offenbar ist meine Annahme falsch, dass es ausreicht, einen 
genügend großen Platz für das Ergebnis vorzuhalten.
Wird das Ergebnis einer Berechnung zunächst immer in dem Datentyp 
abgebildet, den die Inputs der Operation (hier c_2) haben?

von Peter II (Gast)


Lesenswert?

Roman S. schrieb:
> Wird das Ergebnis einer Berechnung zunächst immer in dem Datentyp
> abgebildet, den die Inputs der Operation (hier c_2) haben?

nein, es wird mindestens mit INT gerechnet, oder mit dem größten 
Datentype. Int aber bei dir nur 16bit.

von Karl H. (kbuchegg)


Lesenswert?

Roman S. schrieb:
> Danke, beide Varianten haben funktioniert. Frage: Wenn die
> Ergebnis-Variable doch als uint32_t deklariert ist, warum muß ich dann
> casten? Offenbar ist meine Annahme falsch, dass es ausreicht, einen
> genügend großen Platz für das Ergebnis vorzuhalten.

Der Datentyp der Ergebnisvariablen interessiert nicht, wenn es darum 
geht a<<5 zu berechnen. Denn erst das Ergebnis davon wird an die 
Variable zugewiesen und erst dann ist der Datentyp der Ergebnisvariablen 
interessant. Aber für die Operationen auf der rechten Seite eines = ist 
das völlig uninteressant. Da zählen nur die Typen der beteilgten 
Operanden.

von Roman S. (kadege)


Lesenswert?

Super, hab's verstanden. Danke!

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.