unsigned long geht nicht?

Gast #1412290
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
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
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
> 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.
Gast #1412317
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.
#1412338
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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.