vier 8bit-zahlen (char) in eine 32bit-zahl wandeln

OP #1617639
Hallo zusammen.
ich habe ein problem, bei dem ich dringend hilfe brauche, da ich sonst 
mit meinem projekt nicht weiter kommme.
(Ich programmiere einen Atmega128 in C mit AVR Studio)
und zwar: ich habe ein array[4]
z.b.
char array[4];

array[0]=0xA1;
array[1]=0xB2;
array[2]=0xC3;
array[3]=0xD4;

welches eine Zahl darstellt.

Zahl=0xA1B2C3D4;

Mit dieser Zahl muss ich einiges rechnen.
Meine Fragen:
Wie muss ich die Variable Zahl definieren? ich denke: long int Zahl;
Was hat es mit uint32_t uint16_t auf sich?
wie wandel ich das array in eine zusammenhängende Zahl um?
ich habe dazu schon einiges versucht. z.b. die zahl einfach direkt 
zusammen zufügen:
Zahl=(unsigned 
long)((array[0]<<24)|(array[1]<<16)|(arrayr[2]<<8)|(array[3]));

dabei bekomm ich aber folgende warining:
warning: left shift count >= width of type

für 2byte funktioniert es.

auch mit der funktion "strtoul" hab ich kein ergebniss bekommen

Zahl=strtoul(array,(void *) 0,16);

es muss doch eine möglichkeit geben im atmega128 mit einer 32bit großen 
zahl rechnen zu können oder?

vielen vielen dank für etwaige hilfe

stefan
Stefan Haller schrieb:

> dabei bekomm ich aber folgende warining:
> warning: left shift count >= width of type

ist jetzt nur geraten: vielleicht solltest du die einzelnen Zahlen erst 
in long ints umwandeln und dann shiften...
Persönliche Seite
So kann man das machen, allerdings ist das nicht portabel, d.h., es 
verhält sich von Prozessorarchitektur zu Prozessorarchitektur 
unterschiedlich:
1
uint8_t array[4];
2
uint32_t Zahl;
3

4
array[0]=0xA1;
5
array[1]=0xB2;
6
array[2]=0xC3;
7
array[3]=0xD4;
8

9

10
Zahl = *((uint32_t *) array);

Das Problem hierbei ist die endianness, die darüber bestimmt, in 
welcher Reihenfolge die vier einen 32-Bit-Wert ausmachenden Bytes im 
Speicher abgelegt werden. Auf einer "big-endian"-Architektur wie z.b. 
68000 ist das Ergebnis obiger Aktion 0xA1B2C3D4, auf einer 
"little-endian"-Architektur wie z.B. x86 ist das Ergbnis hingegen 
0xD4C3B2A1.

Wie es auf einem 8-Bit-System wie dem AVR implementiert wird, hängt rein 
vom verwendeten Compiler ab; dem Controller selbst ist es vollkommen 
wurscht, da der sowieso nur 8-Bit-Zahlen kennt.
Stefan Haller schrieb:

> char array[4];

schon falsch.
Du willst hier auf keinen Fall 'char'
Du willst entweder 'unsigned char' oder 'signed char'. Aber auf keinen 
Fall 'char'

> array[0]=0xA1;
> array[1]=0xB2;
> array[2]=0xC3;
> array[3]=0xD4;
>

  uint32_t zahl = *(uint32_t*)array;

aber pass auf die Endianess auf. (kurz gesagt: die Reihenfolge der Bytes 
im Array)

> es muss doch eine möglichkeit geben im atmega128 mit einer 32bit großen
> zahl rechnen zu können oder?

Klar gibt es die.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.