unsigned long geht nicht?

Gast #1412290
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++
Gast #1412306
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?!?
#1412309
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.
Gast #1412312
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.
#1412338
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.
#1412345
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren