Forum: Compiler & IDEs Frage zum verbinden zweier 8 Bit register in GCC


von Hans Peter (Gast)


Lesenswert?

Habe ein Problem mit den Verbinden zweier 8 bit register vom SPI.

MSB 1. 8Bit=204
LSB 2. 8Bit=112


ergebniss soll sein 52336.

in DEV C++ habe ich es so gemacht.



int zwert1,MSB,LSB;
zwert1=MSB<<8;
eregbniss=zwert1+LSB; //ergebniss=52336;



so habe ich es auch in GCC Portiert.

nur bekomme ich bei zwert1= -13312 heraus
und als ergebniss=-13200

Wo ist der Fehler????




von Ronny (Gast)


Lesenswert?

Beim Datentyp.Wenn 'int' automatisch als 'unsigned' interpretiert 
wird,funktioniert alles wie gewohnt.Als 'signed' ist das höchste Bit 
jedoch das  Vorzeichenbit.

Abhilfe: Datentypen vollständig deklarieren:

unsigned int zwert1,MSB,LSB;

von Hans Peter (Gast)


Lesenswert?

Hallo

habe es jetzt mal mit unsigned probiert das selbe in grün.


void test1()
{
unsigned int zwert1,MSB,LSB,ergebniss;
MSB=204;
LSB=112;
zwert=MSB<<8;
ergebniss=zwert1+LSB; //-13200
}

warum klappt es nicht.

auch wenn ich folgendes mache kommt nur ein -13200 heraus.

unsigned int ergebniss;
ergebniss=(204<<8)+112;



von Ronny (Gast)


Lesenswert?

Wie genau zeigst du das Ergebnis den an?Im Debugger?Oder per z.B. per 
printf()? Letzterem ist es egal, welche Daten du übergibst,es wird so 
interpretiert wie es im Formatstring steht...

von Karl H. (kbuchegg)


Lesenswert?

> auch wenn ich folgendes mache kommt nur ein -13200 heraus.

Da kann nicht -13200 herauskommen, da der Datentyp jetzt
unsigned ist, also kein Vorzeichen hat!

Wie Ronny schon richtig feststellte, liegt dein Problem
jetzt höchst wahrscheinlich in der Art und Weise wie
du den Inhalt von ergebniss kontrollierst. Du hast also
in die Kontrolle einen Fehler eingebaut.

von Hans Peter (Gast)


Lesenswert?

Also das Problem liegt am printf

printf("Ergebiss %d",ergebniss); //-13200
printf("Ergebniss %x",ergebniss); 0xcc70 das entsoricht dem wahren wert.


Habe noch ein Problem Bit0-Bit5 aus dem LSB zu extrahieren.

habe eine Zahl 16Bit  9504

ich benötige die 8bit MSB und 8 bit LSB

das mache ich so


unsigned int zw1,MSB,LSB,wert;
wert=9504;

    zw1=(wert>>8);
    MSB=zw<<8;
    LSB=wert-MSB;


LSB=32; //das sind ja eigendlich schon die Werte Bit0-5.

aber was mache ich wenn es zb 11110101 die 6 LSB herausnehme.
(110101 soll rauskommen).
da benötige ich doch noch einen Rechenschritt.


Danke





von Ronny (Gast)


Lesenswert?

Schau dir doch mal in einem C-Buch an,was die Formatierungszeichen für 
printf() bedeuten (insbesonders %d).

http://home.fhtw-berlin.de/~junghans/cref/FUNCTIONS/format.html

von Ronny (Gast)


Lesenswert?

Nachtrag:

Ersetz das "%d" mal durch ein "%u",das löst vorerst dein Problem.

Dein eigentliches Problem besteht jedoch weiterhin.Mach dich doch mal 
mit den unterschiedlichen Datentypen vertraut,insbesonders wie sie im 
binärem System dann aussehen.Dann sollte einiges klarer werden.printf() 
interpretier lediglich einen 16-Bitwert (oder unter Windows 32bit) 
so,wie du es ihm im Formatstring vorschreibst.Du könntest ihm den 
unsigned int auch als String verkaufen,jedoch mit unvorhersehbaren 
Folgen da dann der Inhalt deiner Variable als Zeiger interpretiert 
werden würde.

von Peter D. (peda)


Lesenswert?

Hans Peter wrote:
> ich benötige die 8bit MSB und 8 bit LSB

Wenn Du 8 Bit willst, warum nimmst Du dann 16 Bit Variablen ?
Man muß ja den SRAM nicht absichtlich vergeuden.
1
unsigned char lsb, msb;
2
3
msb = wert >> 8;
4
lsb = wert;

Und wenn Du nur 6 Bit willst, dann eben
1
lsb = wert & 0x3F;


Peter

von Hans Peter (Gast)


Lesenswert?

Ah Ja so gehts.

Besten Dank

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.