PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Umwandlung 32 bit in Dezimalzahl



Lowoj
29.02.2012, 20:55
Hallo Leute ich brauch einen Tipp oder Hinweis bei einem C - Programm.
Ich habe den Inhalt von vier Registeradressen von 4 x 8 bit nach 32 bit konvertiert
(hoffe ich doch !!) Nun möchte ich den Inhalt von 32 bit in eine Dezimalzahl umwandeln
und über printf ausgeben. Ich brauche ein Beispiel oder Hinweise für die Umwandlung 32
bit in Dezimalzahl.

Im voraus schon mal Herzlichen Dank für Eure Mühe LOWOJ


typedef union
{
unsigned long as_long ;
unsigned char as_byte[4];
} data32_t;

data32_t zaehler;
zaehler.as_long ;
zaehler.as_byte[0] = 0x02;zaehler.as_byte[1] = 0x03;zaehler.as_byte[2]=0x04; zaehler.as_byte[3] = 0x05;

printf("Zaehler :%u\n",zaehler);

RoboHolIC
29.02.2012, 22:21
Umwandlung 32 bit in Dezimalzahl
Evtl. mal suchen nach Standardfunktionen wie z.B. itoa() "integer to ascii", damit man's auf einem Display anzeigen lassen kann.

markusj
29.02.2012, 22:25
Die Konvertierung Binärzahl -> Dezimalstring macht printf selbst, du musst allerdings zaehler.as_long übergeben statt zaheler.
Das was du mit dem Union machst nennt sich übrigens type-punning. Unions sind eigentlich NICHT dafür ausgelegt (der C-Standard garantiert dir NICHT dass der Union das tut was du von ihm erwartest), zumindest für den GCC gibt es aber eine entsprechende Aussage in der Dokumentation die das gewünschte Verhalten zusichert.

mfG
Markus

Lowoj
02.03.2012, 19:53
Hallo RoboHolIC danke für deinen Hinweis. Habe mich eingelesen, konnte mein Problem mit itoa() nicht lösen. Bekomme immer eine statische Zahl angezeigt ( 4199543 ) ich nehme an das mir die Bits angezeigt
werden. Ich möchte aber vier Register a. ein Byte zu 32 Byte zusammen führen und über printf anzeigen lassen. Drehimpulsgeber eines E-Motors.

Lowoj
02.03.2012, 20:03
Hallo Markus danke für deine hilfe. Habe es mit der übergabe von zaehler.as_long versucht. Bekomme aber nur eine statische Zahl als anzeige ( 4199543 ) ich nehme an das mir die Bits angezeigt werden.

RoboHolIC
02.03.2012, 23:03
@Lowoj:
Zwei Dinge, die mir auf- bzw. eingefallen sind:
a) Ich hab's nicht so mit C, dein Code würde mir also nicht viel sagen, aber deine konstante Integerzahl riecht nach Adresse der 32bit-Variable oder schiefem Pointer oder so.
b) Statt per Union könnte man die 32bit-Zahl auch durch Addition der gewichteten Bytewerte darstellen:
32Bit-Zahl = 256^3*MostSignificantByte + 256^2*(zweithöchstes Byte) + 256^1(zweitniedrigstes Byte) + LeastSignificantByte.
Ich hoffedenkemeine, daß man damit auf der sicheren Seite sein müßte.
c) vielleicht heißt der passende Befehl auch utoa(), u für unsigned. Beschreibe doch mal eine 32bit-Variable mit einer fixen Dezimalzahl und verwurste sie mit den Standardfunktionen, bis ebendiese Dezimalzahl am Schirm erscheint. Danach kannst du dich der Zusammenführung der Bytes widmen. Also möglichst nur an _einer_ Baustelle arbeiten.
d) Reihenfolge der Werte im Array invertieren, vielleicht stimmt dort etwas nicht. Dabei nur _ein_ Byte ungleich Null setzen, damit man's besser nachvollziehen kann.