#include <stdio.h> #if defined BIT_SET || defined BIT_CLR || defined BIT_TGL || defined BIT_TST # error "BIT_xxx bereits irgendwo definiert :-(" #else # define BIT_SET(VAL, INDEX) (VAL |= (1 << INDEX)) # define BIT_CLR(VAL, INDEX) (VAL &= ~(1 << INDEX)) # define BIT_TGL(VAL, INDEX) (VAL ^= (1 << INDEX)) # define BIT_TST(VAL, INDEX) (VAL & (1 << INDEX)) #endif int main() { unsigned long l; printf("\n%d",BIT_SET(l,31)); return 0; } Wieso bekomm ich: >-2147483648 >...Program finished with exit code 0 >Press ENTER to exit console. ausgegeben? Die Variable l ist doch eindeutig long und vorallem unsigned?
ach je ... zu vorschnell gepostet - habs gesehen: der Formatstring von printf ist Schrott ... %u muss da natürlich rein
Martin H. schrieb: > Hat das der Compiler ohne Warnung geschluckt? ja .. allerdings übe ich am online-Compiler https://www.onlinegdb.com/online_c_compiler
cvril schrieb: > ach je ... zu vorschnell gepostet - habs gesehen: > > der Formatstring von printf ist Schrott ... %u muss da natürlich rein Immer noch falsch. Abgesehen von anderem Unsinn muss bei unsigned long %lu rein.
Der Makro liest den Wert der Variablen, setzt ein Bit und schreibt zurück. Welcher Wert wird dabei gelesen?
A. K. schrieb: > Der Makro liest den Wert der Variablen, setzt ein Bit und schreibt > zurück. Welcher Wert wird dabei gelesen? na der Wert, der sich aufgrund des gesetzten Bits ergibt
cvril schrieb: > na der Wert, der sich aufgrund des gesetzten Bits ergibt Was passiert da: l = l | 1 << 31; printf(..., l); Es wird also zuerst l gelesen. Mit welchem Wert? Gesetzt wird erst danach.
:
Bearbeitet durch User
A. K. schrieb: > Es wird also zuerst l gelesen. Mit welchem Wert? > Gesetzt wird erst danach. achso ... du meinst die Fehlende initialisiserung von l?
Ich würde übrigens abraten, eine Variable "l" zu nennen. Der Unterschied zu "1" ist oft eher subtil.
A. K. schrieb: > ja dann werde ich natürlich besser die Variable ausserhalb von main() deklarieren, denn so wird sie zur globalen Variable und automatisch mit NULL initialisiert;-)
cvril schrieb: > dann werde ich natürlich besser die Variable ausserhalb von main() > deklarieren, > denn so wird sie zur globalen Variable und automatisch mit NULL > initialisiert;-) könnte man schon machen, aber ein "=0" dahinter braucht auch nicht viel Zeit, zudem sollten Variablen möglichst lokal deklariert sein. Oder soll der Smiley am Schluss Ironie darstellen?
ist ja alles richtig! Es ging mir ja mehr darum das "wurschteln" mit einzelnen Bits etwas einfacher und transparenter zu machen ... main() mit seinem spartanischen Inhalt in Form einer printf() Funktion war ja nur ein Test, um ma schnell zu sehen, ob die Bits richtig gesetzt etc. werden ... deshalb hatte ich auch auch die Initialisierung mit NULL in der Schnelle vergessen .... und in der Schnelle auch printf nen falschen formatstring mitgegeben ..und mich dann über negativen Wert bei der Ausgabe des Variabeninhalts gewundert ..also: Alles gut!
:
Bearbeitet durch User
> globalen Variable und automatisch mit NULL > die Initialisierung mit NULL Warum willst du einen Nicht-Pointer mit NULL initialisieren? NULL ist nicht das, was du denkst was es ist. NULL =! 0, bzw. haengt es von der Umgebung ab. stddef.h
1 | #ifdef __cplusplus
|
2 | # if !defined(__MINGW32__) && !defined(_MSC_VER)
|
3 | # define NULL __null
|
4 | # else
|
5 | # define NULL 0
|
6 | # endif
|
7 | #else
|
8 | # define NULL ((void*)0)
|
9 | #endif
|
1 | #include <stddef.h> |
2 | |
3 | int main() { |
4 | unsigned long i = NULL; |
5 | return 0; |
6 | }
|
1 | $ gcc -Wall -Wextra -std=c11 -o main test.c |
2 | test.c: In function 'main': |
3 | test.c:4:23: warning: initialization of 'long unsigned int' from 'void *' makes integer from pointer without a cast [-Wint-conversion] |
4 | unsigned long i = NULL; |
Kaj schrieb: >> die Initialisierung mit NULL > Warum willst du einen Nicht-Pointer mit NULL initialisieren? NULL ist > nicht das, was du denkst was es ist. NULL =! 0, bzw. haengt es von der > Umgebung ab. > > stddef.h#ifdef __cplusplus > # if !defined(_MINGW32_) && !defined(_MSC_VER) > # define NULL __null > # else > # define NULL 0 > # endif > #else > # define NULL ((void*)0) > #endif > #include <stddef.h> > > int main() { > unsigned long i = NULL; > return 0; > } OMG! 1. steht NULL im normalen Text und nicht im Sourecode - so dass ich die Ziffer "0" gemeint habe ( die Großschreibung war unbeabsichtigt ) 2. ist im C Source NULL zuerst mal ein Makro! Ob dahinter dann die Ziffer "0" oder ein Zeiger sich verbirgt - steht auf einem anderen Blatt! 3. Wer hat in diesem Thread etwas von C++ gesagt? Es mag ja sein, dass Du ein schlauer C++ Programmierer bist oder werden willst aber wenn Du schreibst "NULL ist nicht das, was du denkst was es ist", dann impliziert das, dass Du zu wissen glaubst was ich denke? Da verhebst Du Dich etwas ;-)
Walter K. schrieb: > OMG! Ja, OMG! Du sagst es. Walter K. schrieb: > 3. Wer hat in diesem Thread etwas von C++ gesagt? Niemand, aber du scheinst das Makro auch nicht zu verstehen. C++ Teil:
1 | #ifdef __cplusplus
|
2 | # if !defined(__MINGW32__) && !defined(_MSC_VER)
|
3 | # define NULL __null
|
4 | # else
|
5 | # define NULL 0
|
6 | # endif
|
C Teil:
1 | #else
|
2 | # define NULL ((void*)0)
|
3 | #endif
|
Walter K. schrieb: > 2. ist im C Source NULL zuerst mal ein Makro! > Ob dahinter dann die Ziffer "0" oder ein Zeiger sich verbirgt - steht > auf einem anderen Blatt! An der Stelle gibt es nur kein "0 oder Zeiger". Das Makro ist im C Teil klar! Walter K. schrieb: > Da verhebst Du Dich etwas ;-) Dein Antwort sagt alles dazu. Walter K. schrieb: > 1. steht NULL im normalen Text und nicht im Sourecode - so dass ich die > Ziffer "0" gemeint habe ( die Großschreibung war unbeabsichtigt ) Vielleicht solltest du einfach anerkennen, das Du dich in dem gegebenen Kontext ungluecklich ausgedrueckt hast. Und das NULL nicht im Source Code steht ist klar, wurde ja vegessen... > deshalb hatte ich auch auch die Initialisierung mit NULL > in der Schnelle vergessen Wie soll der geneigte Leser aus dem von Dir geschriebenen nun wissen, ob Du 0 (Zahl Null), oder wirklich NULL meinst? Deine Posts suggerieren, das deine Erfahrungen in C eher auf einem Einsteiger Level zu sein scheinen (was nicht weiter schlimm ist/waere. wir haben alle mal klein angefangen), was die Vermutung nahe legt, das du vielleicht wirklich NULL meinen koenntes, weil du es moeglicherweise mit der Zahl Null gleichsetzt. Deswegen mein Hinweis.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.