C negatives unsigned long

Gast #5559319
Lesenswert?

#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?
Gast #5559537
Lesenswert?

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?
#5560495
Lesenswert?

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!
Gast #5560522
Lesenswert?

> 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;
#5561423
Lesenswert?

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 ;-)
Gast #5562879
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren