Forum: Compiler & IDEs C negatives unsigned long


von cvril (Gast)


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?

von cvril (Gast)


Lesenswert?

ach je ... zu vorschnell gepostet - habs gesehen:

der Formatstring von printf ist Schrott ... %u muss da natürlich rein

von Martin H. (horo)


Lesenswert?

Hat das der Compiler ohne Warnung geschluckt?

von cvril (Gast)


Lesenswert?

Martin H. schrieb:
> Hat das der Compiler ohne Warnung geschluckt?

ja .. allerdings übe ich am online-Compiler
https://www.onlinegdb.com/online_c_compiler

von (prx) A. K. (prx)


Lesenswert?

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.

von cvril (Gast)


Lesenswert?

A. K. schrieb:
> Abgesehen von anderem Unsinn

welchen?

von (prx) A. K. (prx)


Lesenswert?

Der Makro liest den Wert der Variablen, setzt ein Bit und schreibt 
zurück. Welcher Wert wird dabei gelesen?

von cvril (Gast)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

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
von cvril (Gast)


Lesenswert?

A. K. schrieb:
> Es wird also zuerst l gelesen. Mit welchem Wert?
> Gesetzt wird erst danach.

achso ... du meinst die Fehlende initialisiserung von l?

von (prx) A. K. (prx)


Lesenswert?

ja

von (prx) A. K. (prx)


Lesenswert?

Ich würde übrigens abraten, eine Variable "l" zu nennen. Der Unterschied 
zu "1" ist oft eher subtil.

von cvril (Gast)


Lesenswert?

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;-)

von hl. Stephanus (Gast)


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?

von Walter K. (walter_k488)


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!

: Bearbeitet durch User
von Kaj (Gast)


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;

von Walter K. (walter_k488)


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 ;-)

von Kaj (Gast)


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.

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
Noch kein Account? Hier anmelden.