Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: bitmaster 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
-
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!
-
Also wenn ich ein 0% davor mache, dann macht gcc eine Null daraus. Und wenn ich nur ein % davor mache, dann meckert gcc.
hmm...
-
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.
-
Es geht nicht in C/C++.
Hm... ok, schade. Wäre ja mal was, womit man C/C++ einwenig auffrischen könnte. :wink:
bitmaster
-
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.
-
[...] 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).
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.
-
Wenn numerische Konstanten in binärer Schreibweise denen in hexadezimaler Schreibweise vorzuziehen sind, ist eh was kaputt am Code.
-
gcc kann 0b mittlerweile, wenn ich mich nicht täusche. Dürfte mit 4.3 dazugekommen sein.
-
# 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 (http://gcc.gnu.org/gcc-4.3/changes.html)
Wobei diese Erweiterung nur im Modus -std=gnu89 (das ist der default) und -std=gnu99 verfügbar ist.
-
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. ;)
-
Ich verwende trotzdem für alles -std=c99 bzw. -std=c++0x.
-
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
-
Meistens nimmt man aber lieber (object-like) Makros oder enums. Dann hat man Namen statt Nummern. :wink:
-
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
-
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 (http://repo.or.cz/w/lightOS.git?a=tree;f=libkernel;hb=HEAD) 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.