Forum: Compiler & IDEs C negatives unsigned long


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von cvril (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
2 lesenswert
nicht lesenswert
ach je ... zu vorschnell gepostet - habs gesehen:

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

von Martin H. (horo)


Bewertung
0 lesenswert
nicht lesenswert
Hat das der Compiler ohne Warnung geschluckt?

von cvril (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
2 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> Abgesehen von anderem Unsinn

welchen?

von (prx) A. K. (prx)


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

von cvril (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
ja

von (prx) A. K. (prx)


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

von cvril (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.