mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik unsigned long geht nicht?


Autor: Timo P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unsigned long kann welche Zahlenwerte speichern?


folgender Code liefert mir werte eines SIGNED long anstelle eines 
unsigend Long:
 unsigned long Dez,i; 
  printf("\n");
  Dez = 990000000;
  for(int i = 0; i<11700;i++)
  {
          Dez += 100000;
          printf("Dez:%d\n",Dez);
   }

Compiler in diesem Fall ist DevC++

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Format Specifier "%d" nimmt ja auch signed int an. Probier mal "%u" 
stattdessen.

Autor: Timo P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
na toll also wenn ich %u wähle dann lässt der mir logischerweise nur das 
Vorzeichen weg.

Man sieht in meinem Code sehr schön, dass aber die WERTE! nicht die 
sind, die man bei einem unsigned erwartet! Es werden negative Werte 
kreiert!

Warum?!?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuch's mal mit Lesen. Der Doku von printf.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timo P schrieb:
> na toll also wenn ich %u wähle dann lässt der mir logischerweise nur das
> Vorzeichen weg.

SO könnte man das auch sehen.
Man kann es aber auch so sehen: Das Most Significant Bit wird dann nicht 
mehr als Vorzeichen gewertet, sondern als ganz normales Dtaenbit.

> Man sieht in meinem Code sehr schön, dass aber die WERTE! nicht die
> sind, die man bei einem unsigned erwartet! Es werden negative Werte
> kreiert!

Ja klar.
Wenn du deinem printf sagst, dass die beiden Bytes, die es bekommt ein 
signed integer sind, dann wertet es die auch so aus. Wenn du ihm mit %u 
mitteilst, dass die beiden Bytes zusammen einen unsigned bilden, dann 
werden sie auch entsprechend ausgewertet.

> Warum?!?

Weil du printf anlügst.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Man sieht in meinem Code sehr schön, dass aber die WERTE! nicht die
> sind, die man bei einem unsigned erwartet! Es werden negative Werte
> kreiert!

nein.

16bit können erstmal nicht negativ sein, erst wenn du sie darstellt wird 
entschieden wie die 16bit zu unterpretieren sind.

Autor: Timo P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Richtig, wenn ich einen zahlenwert zuweise, ist und bleibt das die 
gleiche Bitfolge! IMMER!

zumindest wenn die Bitreihenfolge gleich bleibt ;)
soviel ist mir ja klar.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>16bit können erstmal nicht negativ sein

Wir haben hier zwar 32 Bit-Werte, aber ansonsten hast Du recht...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timo P schrieb:

> soviel ist mir ja klar.

Was ist dir dann unklar?

Ein anderer Erklärungsversuch:
printf kann NICHT anhand des übergebenen Bitmusters unterscheiden, ob 
das nun als signed oder unsigned anzusehen ist. Es ist also auf deine 
Hilfe angewiesen, die du in Form der Formatspezifizierung geben musst. 
printf verlässt sich ganz und gar darauf, dass du keinen Scheiss baust 
und es anweist eine Bitfolge, die du als unsigned sehen möchtest, als 
signed auszugeben.

C: You get, what you asked for.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ganz abgesehen davon sind %u bzw. %d sowieso die völlig falschen 
Formatspezifizierer, da du es mit einem long zu tun hast. Da wäre %lu 
(=unsigned long) bzw %ld (=signed long) angebracht, bzw. das Lesen der 
Doku (wie A.K. schon angemerkt hat) oder noch besser Grundlagenliteratur 
zum Thema C-Programmierung.

Autor: Timo P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich werde %lu nutzen! THX!

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.