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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.