Forum: Mikrocontroller und Digitale Elektronik unsigned long geht nicht?


von Timo P (Gast)


Lesenswert?

unsigned long kann welche Zahlenwerte speichern?


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

Compiler in diesem Fall ist DevC++

von Simon K. (simon) Benutzerseite


Lesenswert?

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

von Timo P (Gast)


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?!?

von (prx) A. K. (prx)


Lesenswert?

Versuch's mal mit Lesen. Der Doku von printf.

von Karl H. (kbuchegg)


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.

von Peter (Gast)


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.

von Timo P (Gast)


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.

von Peter (Gast)


Lesenswert?

>16bit können erstmal nicht negativ sein

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

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


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.

von Timo P (Gast)


Lesenswert?

ich werde %lu nutzen! THX!

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.