Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : elsen's persönlicher Fragethread zu C/C++



elsen
22.10.2008, 20:39
Hallo allerseits =)

Ich lerne zur Zeit C und werde sicher des öfteren auf kleinere oder größere Fragen stoßen.
In diesem Sinne hab ich den Thread hier aufgemacht um meine Fragen zu sammeln und nicht immer wegen jeder Kleinigkeit einen neuen Thread aufzumachen! ;)

Es ist ein Anfängerthread, also nicht über "Billigfragen" aufregen, bitte! ^_^

Meine erste Frage:
Wenn ich eine Variable deklariere, die vom Datentyp unsigned int ist, müsste es nicht eine Fehlermeldung geben, wenn ich ihr mit scanf() einen negativen Wert zuweise?

Mein Testcode:

int main()
{
unsigned int a = 56;
unsigned int b = 12;
unsigned int c;
printf("a = %d\n" ,a);
scanf("%d" ,&a); //ich gebe hier z.B. -45 ein
printf("neuer Wert von a: %d\n" ,a);
c = a + b;
printf("Der Wert von c betraegt %d" ,c); //c hat dann einen Wert von -33
getch();
return 0;
}
Auch nach dem ich mit dem negativen Wert gerechnet habe, sodass auch ein negativer Wert als Ergebnis heraus kommt, gibts keine Fehlermeldung!
Wieso kann man das machen, wenn der Datentyp unsigned ist???

greetz!
elsen =)

Drakes
22.10.2008, 21:30
1. Wie sollte die Fehlermeldung ausgegeben werden? Errorhandling funktioniert üblicherweise über den Rückgabewert. Wobei es hier eigentlich nicht um das geht.
2. Der Wert von c ist nicht -33 sondern 4294967266. Du müsstest beim printf schon den richtigen Buchstaben verwenden und %d ist für signed, für unsigned int ist %u.
3. Du fragst dich wieso das geht. Nun der binäre Wert von -45 ist 0b10000000000.......101101. Wobei dies auch der binäre Wert für 4294967251 ist. Also bitweise gesehen unterscheidet sich eine unsigned Variable nicht von einer signed, jedoch bei der Interpretation. Z. B. bei einem Vergleichsoperator wird dann der richtige Wert genommen. Beispiel:
int a = 4294967251;
unsigned int b = 4294967251;
Nun gilt:
a<0 und b>0,
denn a kann gar keine so grosse Zahl speichern (eigentlich ja eben schon, aber man nimmt das erste Bit für das Vorzeichen). B hat etwa den doppelten Bereich, aber eben nur im positiven Wertebereich.
scanf weiss nicht was du für Parametertypen übergibst (glaub ich zumindest) und liest diese aus deinem Formatierungsstring, also wenn du nun bei der Ausgabe %u verwendest, wird auch kein negativer Wert herauskommen, jedoch auch nicht das von dir gewünschte Ergebnis in diesem Falle. ^^

elsen
22.10.2008, 21:41
tja immer diese Anfänger :rolleyes:

danke Drakes ;)