Forum: Compiler & IDEs Integer Promotion, die Geissel der Menschheit


von Falk B. (falk)


Lesenswert?

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

von Christoph _. (chris)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Rolf Magnus (Gast)


Lesenswert?

> 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
Noch kein Account? Hier anmelden.