Autor Thema: C/C++ und Zahlensysteme  (Gelesen 9700 mal)

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« am: 24. April 2009, 13:08 »
Hi,

ich möchte gerne einer Variable einen Wert zuweisen. Diesen möchte ich aber in binärer Schreibweise angeben. Also bei dezimaler und hexadezimaler würde man es ja so machen:

var = 0xBADC0DE; //hex
var = 195936478; //dez

Tjo in Assembler würde man an der Zahl ja einfach ein kleines b anhängen, aber in C scheint dies nicht zu funktionieren, da mein gcc meckert. Könnt ihr mir sagen wie das geht? Also klar könnte ich den Wert z.B. in hexadezimaler Form angeben und dahinter den Wert binär als Kommentar schreiben, aber wenn es direkt geht, wieso nicht?

thx

bitmaster
In the Future everyone will need OS-64!!!

matheguru

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 24. April 2009, 14:42 »
Ich bin mir nicht ganz sicher schon ne lange weile nicht meht C geprogt. Aber meiner meinung nach ging das entweder mit 0% oder nur das % Zeichen, aber vieleicht verwechsle ich jetzt auch eine Sprache. Ich hoffe es funtzt!
Hacker zu sein bedeutet mehr, als sich nur damit auseinander zu setzen, es ist eine Lebenseinstellung

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #2 am: 24. April 2009, 15:34 »
Also wenn ich ein 0% davor mache, dann macht gcc eine Null daraus. Und wenn ich nur ein % davor mache, dann meckert gcc.

hmm...
In the Future everyone will need OS-64!!!

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #3 am: 24. April 2009, 15:37 »
Es geht nicht in C/C++. Maximal noch oktal durch voranstellen einer 0.

% ist der Modulo-Operator, d.h. der Rest einer ganzzahligen Division und hat zwei Operanden, insofern ist das von matheguru schon syntaktisch komplett kaputt.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #4 am: 24. April 2009, 16:07 »
Es geht nicht in C/C++.Hm... ok, schade. Wäre ja mal was, womit man C/C++ einwenig auffrischen könnte.  :wink:

bitmaster
In the Future everyone will need OS-64!!!

matheguru

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 24. April 2009, 16:13 »
ja ihr habt recht hatte ich vergessen sry bitmaster für die Hoffnungen die ich dir gemacht habe, na ja ist wirklich ergerlich, dass das net geht, höchstens wenn man eine Klasse dafür macht einen neuen Dateintyp erstellt und funktionen schreibt mit inlineasm o. man versucht das ganze über bitmanipulation. Na ja sry noch mal hatte mich halt versehen.
Hacker zu sein bedeutet mehr, als sich nur damit auseinander zu setzen, es ist eine Lebenseinstellung

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #6 am: 24. April 2009, 16:31 »
[...] höchstens wenn man eine Klasse dafür macht einen neuen Dateintyp erstellt und funktionen schreibt mit inlineasm o.[...]
Auch das geht nicht. Zumindest nicht (annährend) mit der gewünschten Syntax (und ohne den Compiler zu verändern).

Zitat
Wäre ja mal was, womit man C/C++ einwenig auffrischen könnte.
C/C++ hat andere Probleme mit denen sich das ISO Comitee befasst bzw. befassen sollte.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 24. April 2009, 18:37 »
Wenn numerische Konstanten in binärer Schreibweise denen in hexadezimaler Schreibweise vorzuziehen sind, ist eh was kaputt am Code.
Dieser Text wird unter jedem Beitrag angezeigt.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 24. April 2009, 20:13 »
gcc kann 0b mittlerweile, wenn ich mich nicht täusche. Dürfte mit 4.3 dazugekommen sein.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #9 am: 24. April 2009, 20:28 »
Zitat
#  Integer constants written in binary are now supported as a GCC extension. They consist of a prefix 0b or 0B, followed by a sequence of 0 and 1 digits.
aus den gcc 4.3 changes

Wobei diese Erweiterung nur im Modus -std=gnu89 (das ist der default) und -std=gnu99 verfügbar ist.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 24. April 2009, 20:33 »
Die Compilerunabhängigkeit hat man eh verloren, wenn man zum ersten Mal ein asm in seinen Code reinbastelt. Nachdem das bei einem Kernel ab und zu passieren soll, machen die restlichen gcc-Erweiterungen dann auch nicht mehr viel aus. ;)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #11 am: 24. April 2009, 20:37 »
Ich verwende trotzdem für alles -std=c99 bzw. -std=c++0x.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #12 am: 24. April 2009, 22:24 »
Wenn numerische Konstanten in binärer Schreibweise denen in hexadezimaler Schreibweise vorzuziehen sind, ist eh was kaputt am Code.
Nö, nur gibt es manchmal Bits, die eine gewisse Bedeutung haben. Deshalb sieht eine binäre Schreibweise manchmal deutlicher aus. Aber OK, man kann ja in Kommentaren dahinter schreiben was welches Bit bewirkt.

bitmaster
In the Future everyone will need OS-64!!!

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #13 am: 24. April 2009, 22:58 »
Meistens nimmt man aber lieber (object-like) Makros oder enums. Dann hat man Namen statt Nummern. :wink:
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #14 am: 25. April 2009, 07:30 »
Meistens nimmt man aber lieber (object-like) Makros oder enums. Dann hat man Namen statt Nummern. :wink:
Aber bei manchen Sachen hat man einfach keine Lust sich so viele Namen auszudenken. :-P

Nee, stimmmt schon. Du meinst sicher:

var = CONST1 or COST2 or CONST3;
Nun ja, aber da bin ich dann doch im Moment ein wenig zu faul für. Aber im Grunde hast du schon recht.

bitmaster
In the Future everyone will need OS-64!!!

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #15 am: 25. April 2009, 11:15 »
Also ich kann nur empfehlen, dass so zu machen, va. wenn es sich um die Kernel <-> Prozesse Schnittstelle handelt: Da würde ich das ganze in extra Headerdateien (ich hab das bei mir einfach mal in einen Unterordner libkernel gepackt, die Sourcecodedateien werden nur in den Userspace gelinkt) schreiben und die jeweils von Prozess bzw. von Kernel Seite inkludieren. Da sparst du dir dann Arbeit. Nicht nur Arbeit im Sinne von du musst die Defines nur einmal machen, sondern auch Arbeit im Sinne von es entstehen keine (schwer zu debuggenden) Bugs indem du irgendwas an der Schnittstelle nur im Kernel aber nicht im Userspace abgeändert hast.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

 

Einloggen