mikrocontroller.net

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


Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christoph __ (chris)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.