Frage zum verbinden zweier 8 Bit register in GCC

Gast #431562
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????



Gast #431564
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;
Gast #431566
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;


#431589
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.
Gast #431621
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




Gast #431626
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.
#431627
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren