www.mikrocontroller.net

Forum: GCC "binary constants are a GCC extension" bedeutet?


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Steven (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo Forum.

Was bedeutet denn die Warning "binary constants are a GCC extension"?
Die Warning zeigt auf folgende Zeile:
DDRB = 0b11111000;

Wüsste jetzt aber nicht warum der da ne Warning wirft...

Steven

Autor: Klaus Wachtler (mfgkw)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Das 0b... ist nicht Standard-C.

Nach ANSI- oder ISO- oder sonstwas C gibt es nur dezimale, oktale und 
hexadezimale Schreibweisen für ganze Zahlen.

Nachdem man das gesehen und verstanden hat, spricht aber nichts dagegen, 
es zumindest in so einem Fall zu verwenden - schließlich ist jedes 
Registergefummel per se unportabel.

Autor: Steven (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Oh, okay.
Finde ich aber sehr praktisch das man sowas darf.
Bleibt also drin ;)

Autor: Andreas B. (andreas_b77)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Ist die Option -pedantic beim gcc Aufruf gegeben? Dann warnt gcc, wenn 
zum Standard inkompatible Erweiterungen verwendet werden.

Autor: Yalu X. (yalu) (Moderator)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Die standardkonforme Methode (für 8-Bit-Werte) geht so:
// Makrodefinition:

#define B(x) \
  0##x >>  0 & 0x01 | \
  0##x >>  2 & 0x02 | \
  0##x >>  4 & 0x04 | \
  0##x >>  6 & 0x08 | \
  0##x >>  8 & 0x10 | \
  0##x >> 10 & 0x20 | \
  0##x >> 12 & 0x40 | \
  0##x >> 14 & 0x80

// Anwendung:

unsigned char a[] = {
  B(11111111),   // 255
  B(0),          //   0
  B(101),        //   5
  B(10101010),   // 170
  B(00000001),   //   1
  B(10000000)    // 128
};

Für 16- und 32-Bit-Werte kann das Makro entsprechend erweitert werden.
Aber wer schreibt schon so große Zahlen im Dualsystem?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Yalu X. schrieb:
> Aber wer schreibt schon so große Zahlen im Dualsystem?

Mir ist sogar unbegreiflich, worin der Reiz liegt, 8-Bit-Zahlen binär zu 
notieren; können die Leute heutzutage kein Hex mehr?

Autor: Rudi D. (rulixa)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Rufus Τ. Firefly schrieb:
> Yalu X. schrieb:
>> Aber wer schreibt schon so große Zahlen im Dualsystem?
>
> Mir ist sogar unbegreiflich, worin der Reiz liegt, 8-Bit-Zahlen binär zu
> notieren; können die Leute heutzutage kein Hex mehr?

Ehrlich gesagt, finde ich diese Schreibweise fallweise für 
angebracht.Speziell wenn es Register im AVR-µC betrifft, wo man gerne 
was auf 1<<ADMUX z.B. Aber jene Bits eines Registers, die auf 0 bleiben 
haben ja auch ihre Bedeutung und das ist dann deutlicher zu sehen.
Aber letztlich Geschmackssache, denke ich. Ich komme von der 
Assemblerseite, wo ich das schätzte. Bin jetzt noch in der C-Lernphase.

LG Rudi

Autor: Simon K. (simon) Benutzerseite
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Rudi D. schrieb:
> Ehrlich gesagt, finde ich diese Schreibweise fallweise für
> angebracht.Speziell wenn es Register im AVR-µC betrifft, wo man gerne
> was auf 1<<ADMUX z.B. Aber jene Bits eines Registers, die auf 0 bleiben
> haben ja auch ihre Bedeutung und das ist dann deutlicher zu sehen.
> Aber letztlich Geschmackssache, denke ich. Ich komme von der
> Assemblerseite, wo ich das schätzte. Bin jetzt noch in der C-Lernphase.

Das musst du jetzt mal mit einem Beispiel unterlegen.

In den meisten Fällen ist die Binärschreibweise die schlechteste 
Alternative.

Autor: Bernhard M. (boregard)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Simon K. schrieb:
> Das musst du jetzt mal mit einem Beispiel unterlegen.

z.B. einen Zeichensatz für ein Grafikdisplay:
const uint8_t font[256][8] PROGMEM = {
...
{0x0E,0x11,0x01,0x02,0x04,0x08,0x1F,0x00},
...
vs.
const uint8_t font[256][8] PROGMEM = {
...
{
        0b00001110,
        0b00010001,
        0b00000001,
        0b00000010,
        0b00000100,
        0b00001000,
        0b00011111,
        0b00000000
},
...

Man kann das zwar auch anders machen...aber als Beispiel...

Autor: Marwin (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Noch ein Beispiel: Fuer meine Menusteuerung gebe ich binaer vor, in 
welche Zeilen anklickbar sind. Und es gibt sicher noch viele andere 
Gruende.

Ich dachte, die "Wer braucht das?"-Fraktion treibt sich im heise-Forum 
herum. Eigentlich draengt sich die Frage "Warum haben sie binaer weg 
gelassen, aber oktal eingebaut?" auf.

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

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Marwin schrieb:

> Ich dachte, die "Wer braucht das?"-Fraktion treibt sich im heise-Forum
> herum. Eigentlich draengt sich die Frage "Warum haben sie binaer weg
> gelassen, aber oktal eingebaut?" auf.

Hat historische Gründe.
Auf der PDP war Oktal das, was für heutige Rechner Hex ist.

Unverständlich ist für mich höchstens, warum der Schmuh immer noch 
drinnen (und vor allen Dingen in dieser Form!) ist.

Autor: A. K. (prx)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Rufus Τ. Firefly schrieb:

> Mir ist sogar unbegreiflich, worin der Reiz liegt, 8-Bit-Zahlen binär zu
> notieren; können die Leute heutzutage kein Hex mehr?

Wer damit angefangen hat, Rechner in Hex zu programmieren, der braucht 
kein Binär, der sieht die Bits auch so. Aber macht sich heute noch die 
Mühe, "Rechner" mit Hex-Tastatur und 7-Segment-Display zu bauen? Ausser 
ein paar Computer-Historikern.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
A. K. schrieb:
> der braucht kein Binär, der sieht die Bits auch so.

Man muss sich nur 16 Bitmuster merken ... oder herleiten können. Sollte 
eigentlich kein Problem sein, wo doch heutige Telephonnummern auch immer 
länger werden.

Autor: A. K. (prx)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Rufus Τ. Firefly schrieb:

> Man muss sich nur 16 Bitmuster merken ... oder herleiten können. Sollte
> eigentlich kein Problem sein, wo doch heutige Telephonnummern auch immer
> länger werden.

Da gibts aber ein definiertes Limit, mehr als 15 Ziffern ist nicht drin. 
Ausserdem müssen viele erst ihr Telefon fragen, welche Nummer die grad 
verwendete Karte hat.

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




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 erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net