Forum: Compiler & IDEs "binary constants are a GCC extension" bedeutet?


von Steven (Gast)


Lesenswert?

Hallo Forum.

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

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

Steven

von Klaus W. (mfgkw)


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.

von Steven (Gast)


Lesenswert?

Oh, okay.
Finde ich aber sehr praktisch das man sowas darf.
Bleibt also drin ;)

von Andreas B. (andreas_b77)


Lesenswert?

Ist die Option -pedantic beim gcc Aufruf gegeben? Dann warnt gcc, wenn 
zum Standard inkompatible Erweiterungen verwendet werden.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Die standardkonforme Methode (für 8-Bit-Werte) geht so:
1
// Makrodefinition:
2
3
#define B(x) \
4
  0##x >>  0 & 0x01 | \
5
  0##x >>  2 & 0x02 | \
6
  0##x >>  4 & 0x04 | \
7
  0##x >>  6 & 0x08 | \
8
  0##x >>  8 & 0x10 | \
9
  0##x >> 10 & 0x20 | \
10
  0##x >> 12 & 0x40 | \
11
  0##x >> 14 & 0x80
12
13
// Anwendung:
14
15
unsigned char a[] = {
16
  B(11111111),   // 255
17
  B(0),          //   0
18
  B(101),        //   5
19
  B(10101010),   // 170
20
  B(00000001),   //   1
21
  B(10000000)    // 128
22
};

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

von Rufus Τ. F. (rufus) Benutzerseite


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?

von Rudi D. (rulixa)


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

von Simon K. (simon) Benutzerseite


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.

von Bernhard M. (boregard)


Lesenswert?

Simon K. schrieb:
> Das musst du jetzt mal mit einem Beispiel unterlegen.

z.B. einen Zeichensatz für ein Grafikdisplay:
1
const uint8_t font[256][8] PROGMEM = {
2
...
3
{0x0E,0x11,0x01,0x02,0x04,0x08,0x1F,0x00},
4
...
vs.
1
const uint8_t font[256][8] PROGMEM = {
2
...
3
{
4
        0b00001110,
5
        0b00010001,
6
        0b00000001,
7
        0b00000010,
8
        0b00000100,
9
        0b00001000,
10
        0b00011111,
11
        0b00000000
12
},
13
...

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

von Marwin (Gast)


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.

von Karl H. (kbuchegg)


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.

von (prx) A. K. (prx)


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.

von Rufus Τ. F. (rufus) Benutzerseite


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.

von (prx) A. K. (prx)


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.

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.