www.mikrocontroller.net

Forum: Compiler & IDEs Binärzahl eingeben


Autor: Christian Wolf (clupus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo allerseits,

nur eine kurze Frage mit (hoffentlich) kurzer Antwort:

Gibt es eine Möglichkeit im GCC eine Binärzahl einzugeben? Bei
Hexdezimal-Zahlen muss ich ja das Perfix 0x voranstelen. Gibt es da
eine analoge Schache bei binär? Oder kann man da ein Makro definieren?

MfG
Christian

PS: Zum Thema Makros: Kann ich eigentlich einen Code definieren, der
mit zur Compile-Zeit durchlaufen wird (z.Bsp. Berechnung von pi (nur
Beispiel! Ich waeiß, das gibt's in der lib.)) und dann als Konstante
zur Verfügung steht?

Autor: mr.chip (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Mit dem Präfix 0b vielleicht ? ;-)

Gruss

Michael

Autor: Christian Wolf (clupus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

An so was hab ich auch schon gedacht. Da bekomm ich folgenden Fehler:

» hardware.h:172:11: error: invalid suffix "b11110000" on integer
constant

bei dem Befehl
» MCUCR &= 0b11110000;

Was mache ich falsch?

MfG
Christian

Autor: Joe Die (kosmonaut_pirx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
habe mal wirklich bei k&r nachgeschaut, aber nichts derartiges
gefunden. warum willst du dir diese mehrarbeit an tippen machen, hexa
sagt doch als darstellung(!) schon recht viel aus.
bye kosmo

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Machs mit nem Macro, dann ist es portabel:
#define B8(y)  ((unsigned char)(
                       0##y       &   1 \
                     | 0##y >>  2 &   2 \
                     | 0##y >>  4 &   4 \
                     | 0##y >>  6 &   8 \
                     | 0##y >>  8 &  16 \
                     | 0##y >> 10 &  32 \
                     | 0##y >> 12 &  64 \
                     | 0##y >> 14 & 128 ))

Und dann einfach: i = B8(10101010); // 0xAA


Es gibt ne gepatchte AVR-GCC Version, die 0b... versteht, aber das ist
nicht portabel.


Peter

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
» MCUCR &= 0b11110000;

Porbiers mal mit MCUCR = 0b11110000;
OHNE '&'!

Autor: mr.chip (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

0b ist also 'inoffiziell' bzw. nicht ganz korrektes C?

Gruss

Michael

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sonic: Das hat damit garnichts zu tun...

@mr.chip: Ganz ehrlich? Das wundert mich auch gerade :-) Warum gibt es
kein offizielles Prefix für Binärwerte? Naja, wie auch immer, ich komme
ebenfalls ohne Binärwerte aus.

Entweder ich setze bits in nem Register mit (1<<Bitnr), oder ich nehm
die hexadezimale Schreibweise.

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

Bewertung
0 lesenswert
nicht lesenswert
> Warum gibt es
> kein offizielles Prefix für Binärwerte?

Weil die C-Päpste bei der letzten Überarbeitung des Standards
der Meinung waren, dass das keiner braucht und auch kein
nennenswerter Compiler bereits implementiert hätte.

Im Amtsenglisch des C rationale liest sich das dann so:

``A proposal to add binary constants was rejected due to
lack of precedent and insufficient utility.''

Ich habe meinen 0b-Patch bei GCC offiziell als Spracherweiterung
eingereicht.  Letztlich sind viele der früheren GCC-Erweiterungen
mittlerweile im Standard zu finden.  Wenn das mal endlich
angenommen und eingearbeitet worden ist, dann sollte sich zumindest
der Punkt ``lack of precedent'' bei der nächsten Überarbeitung
des Standards erledigt haben...

Autor: Christian Wolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist das mit dem 0b patch? Muss der beim Compilieren (vom avr-gcc
selbst) eingespielt werden, oder ist das nur ein plug-in?

MfG
Christian

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Was ist das mit dem 0b patch?

Du must gar nichts tun. Der avr-gcc kann das von Haus
aus. Den Patch hat derjenige gemacht, der den Compiler
zusammengestellt hat.

Autor: Christian Wolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum geht das dann nicht? Siehe oben. Da hab ich eine Zeile mit
0b11110000 eingegeben; angenommen hat er sich nicht.

Was mache ich falsch/habe ich falsch kompiliert?
Christian

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann ich nicht sagen. Falsche Version?
Klappt bei mir und allen andern hier ohne Probleme
mit dem avr-gcc.

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

Bewertung
0 lesenswert
nicht lesenswert
Du musst den Compiler patchen dafür, wenn es dein Compiler-Lieferant
nicht bereits für dich getan hat.

Autor: Christian Wolf (clupus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab den Compiler selber übersetzt (deshalb frag ich auch). Der gcc
ist eine Vanillia-Version.

MfG
Christian

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

Bewertung
0 lesenswert
nicht lesenswert
Dann solltest du dir wohl die Patches meiner FreeBSD-Versionen
angucken, ansonsten fehlt dir nicht nur die Unterstützung von
0b-Konstanten, sonder auch die für viele aktuelle AVRs.

Die Patches findest du im CVS unter:

http://www.freebsd.org/cgi/cvsweb.cgi/ports/devel/...
http://www.freebsd.org/cgi/cvsweb.cgi/ports/devel/...

Manche davon sind sehr FreeBSD-spezifisch, aber manche sind auch
recht allgemein.  Ach so, du brauchst auch Patches für die binutils:

http://www.freebsd.org/cgi/cvsweb.cgi/ports/devel/...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich hab den Compiler selber übersetzt

Mann. Sag das doch gleich.

Autor: Christian Wolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich gehe davon aus, dass das normal ist, oder etwa nicht???
Ich hab zumindest noch keine binary-packets für SuSE gefunden, die
einigermaßen aktuell sind; wenn ich mir da die neuste gcc-core
runterlade, sieht's da schon anders aus.

MfG
Christian

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

Bewertung
0 lesenswert
nicht lesenswert
> Ich gehe davon aus, dass das normal ist, oder etwa nicht?

Für RPM-Linuxe, ja.

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.