Mann, Mann, Mann, also entweder bin ich doof oder C ist schlimmer als ich immer befürchtet habe. Wie ist das denn nun genau mit dieser dämlichen Integer Promotion? Ich dachte das gilt nur für Konstanten? So wie hier Beitrag "Re: bidirektionale Datenübertragung zwischen 2 Atmega 8" Aber NEIN, das gilt anscheinend auch für Variablen, wobei mir vollkommen schleierhaft ist was der Unsinn soll. Beitrag "Re: bidirektionale Datenübertragung zwischen 2 Atmega 8" Also, was soll der Unsinn bei Variablen? MFG Falk
Beim C-Standard wird davon ausgegangen, dass int der native Datentyp fuer Ganzzahlen ist. Das heisst es wird angenommen, dass int-operationen eben besonders schnell ablaufen. Diese Annahme ist auch sinnvoll bei 16-Bit-CPUs und aufwaerts. Das von dir beschriebene Problem zeigt sich nur bei sowas wie 8-Bit-Architekturen, wo int halt ploetzlich nicht mehr den optimalen Datentyp darstellt. Ansonsten braeuchte man halt eine Sprache mit einem staerkeren Typsystem, wo Umwandlungen wie "short -> int" oder "char -> int" nicht implizit erlaubt sind.
Du kannst dir den Abschnitt 6.3.1.1 im "C99 Rationale" dazu durchlesen. Interessant dürfte insbesondere der Abschluss sein: “The unsigned preserving rules greatly increase the number of situations where unsigned int confronts signed int to yield a questionably signed result, whereas the value preserving rules minimize such confrontations. Thus, the value preserving rules were considered to be safer for the novice, or unwary, programmer. After much discussion, the C89 Committee decided in favor of value preserving rules, despite the fact that the UNIX C compilers had evolved in the direction of unsigned preserving.” Der genannte Fall ist genau so einer, bei dem die "value preserving rules" ein unerwartetes Ergebnis bringen.
> Wie ist das denn nun genau mit dieser dämlichen Integer Promotion? Ich > dachte das gilt nur für Konstanten? Wie kommst du darauf? Konstanten haben schon von sich aus einen Typ. Da muß nix mehr promoted werden. > So wie hier Das ist keine Integer Promotion. Vielmehr ist die Konstante, so wie sie da steht, bereits vom Typ int. Eine Integer Promotion findet nicht statt. > if ((uint8_t)Aktor_1bis4 == (uint8_t)~Aktor_1bis4_negiert) Der Cast auf der linken Seite ist nicht nötig, da Aktor_1bis4 bereits vom Typ uint8_t ist. Auf der rechten Seite findet aber tatsächlich eine Integer Promotion statt für die Invertierung. > Also, was soll der Unsinn bei Variablen? C ist halt eigentlich nicht für 8-Bit-Prozessoren ausgelegt.
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.