Forum: Compiler & IDEs Binärzahl eingeben


von Christian W. (clupus)


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?

von mr.chip (Gast)


Lesenswert?

Hallo

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

Gruss

Michael

von Christian W. (clupus)


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

von Joe D. (kosmonaut_pirx)


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

von Peter D. (peda)


Lesenswert?

Machs mit nem Macro, dann ist es portabel:
1
#define B8(y)  ((unsigned char)(
2
                       0##y       &   1 \
3
                     | 0##y >>  2 &   2 \
4
                     | 0##y >>  4 &   4 \
5
                     | 0##y >>  6 &   8 \
6
                     | 0##y >>  8 &  16 \
7
                     | 0##y >> 10 &  32 \
8
                     | 0##y >> 12 &  64 \
9
                     | 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

von Sonic (Gast)


Lesenswert?

» MCUCR &= 0b11110000;

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

von mr.chip (Gast)


Lesenswert?

Hallo

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

Gruss

Michael

von Simon K. (simon) Benutzerseite


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.

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


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...

von Christian Wolf (Gast)


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

von Karl H. (kbuchegg)


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.

von Christian Wolf (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?

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

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


Lesenswert?

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

von Christian W. (clupus)


Lesenswert?

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

MfG
Christian

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


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/avr-gcc/files/
http://www.freebsd.org/cgi/cvsweb.cgi/ports/devel/avr-gcc-devel/files/

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/avr-binutils/files/

von Karl H. (kbuchegg)


Lesenswert?

> Ich hab den Compiler selber übersetzt

Mann. Sag das doch gleich.

von Christian Wolf (Gast)


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

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


Lesenswert?

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

Für RPM-Linuxe, ja.

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.