Hallo, ich habe 2 Fragen: Was passiert wenn ich folgende sachen schreibe: int i; char c; 1. i = c; schreibt er hier das Char in die unteren 8 Bit des int? 2. c = i; nimmter er hier wieder die unteren 8 Bit des int? 3. c |= i; Was macht er hier? Nach welchen regeln läuft des denn insgesamt ab? 2. Frage Wo kann ich die ganzen Registerdefinitionen nachlesen die nicht im DB stehen. z.B. das ADCH und ADCL = ADCW ist. Gruß Peter
Peter Z. wrote: > Was passiert wenn ich folgende sachen schreibe: Kannst du in jeder ordentlichen Abhandlung über C nachlesen. > int i; > char c; > 1. > i = c; > > schreibt er hier das Char in die unteren 8 Bit des int? Ja, sofern du die Aussage für die unteren 8 Bits haben willst. Für die oberen 8 Bits wurde keine Aussage getroffen. ;-) Diese werden mit 0 gefüllt, sofern c >= 0 && c <= 0x7F ist, mit 1 andernfalls. Das ist übrigens unabhängig davon, ob der Typ `char' vorzeichenbehaftet implementiert ist oder nicht. > 2. > c = i; > > nimmter er hier wieder die unteren 8 Bit des int? Ja, was sonst? > 3. > c |= i; > > Was macht er hier? Nach welchen regeln läuft des denn insgesamt ab? Du solltest dich ernsthaft mit dem Thema `integer promotion rules' in C befassen. Ist garantiert in diversen Tutorials erklärt. In diesem Falle ist es aber unspektakulär, da nur die unteren 8 Bit von i eine Rolle spielen. Diese werden mit dem existierenden Inhalt von c ver-oder-t. > 2. Frage > Wo kann ich die ganzen Registerdefinitionen nachlesen die nicht im DB > stehen. z.B. das ADCH und ADCL = ADCW ist. Wenn zwei aufeinanderfolgende Register ein 16-Bit-Register bilden, haben sie zusätzlich zu den Einzelregistern eine entsprechende Definition erhalten. Dabei wird normalerweise einfach nur der Suffix `L' und `H' weggelassen. Der sich dabei aus ADCH und ADCL ergebende Namen ADC ist jedoch zugleich ein gültiger Assemblerbefehl. Da die Datei <avr/io.h> auch für Assemblerprogrammierung nutzbar sein soll, wird der Name ADC im Assembler-Kontext nicht definiert, und sowohl im Assembler- als auch C-Kontext gibt es zusätzlich den Namen ADCW. Beachte, dass nicht alle Register, bei denen man dergestalt einen 16-Bit-Namen bilden könnte, auch wirklich als 16-Bit-Register implementierbar sind. So liegt das UART-Baudratenregister UBRRxL und UBRRxH manchmal hintereinander im Adressraum und kann als UBRRx angesprochen werden, während die beiden Teile bei anderen AVRs auf nicht aneinandergrenzenden Adressen liegen. grenzende
Hallo, vielen Dank für deine Antwort. Werden mal nach den von dir genannen Schlagwörtern googlen. Gruß Peter
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.