Implizite Typumwandlung

Gast #682796
Lesenswert?
• ▲
▼
Hallo,
mich interessiert das Verhalten des folgenden Codes. Ich finde weder 
hilfe in c-Büchern noch in der GCC Dokumentation.

int a = -500;
unsigned int b = 1000;
unsigned int c = 200;

if ( b > (c+a) )
{
   // code
}
else
{
   // code
}

Ist das Ergebniss des Ausdrucks (c+a) ein unsigned int oder ein signed 
int? Je nachdem wird der if oder der else Zweig ausgeführt! Ist das 
Compilerabhängig oder in ANSI C definiert?
Wer kennt eine gute Dokumentation über die implizite Typenumwandlung in 
C?

Vielen Dank
Markus
#682918
Lesenswert?
• ▲
▼
Es wird immer auf das höhere Format erweitert (natürliche Zahl -> 
Ganzzahl -> Kommazahl).

Bei gleichem Format wird die Länge erweitert (char -> short -> long).

Die Erweiterung erfolgt immer nach dem höchsten Quelloperanden, Ausnahme 
Schiebeoperation, da zählt nur der linke Operand.

Ein Zielüberlauf ist C völlig wurscht, da muß man selber rechtzeitig 
erweitern.


Peter
Moderator Persönliche Seite #682942
Lesenswert?
• ▲
▼
Markus wrote:

> Ist das Ergebniss des Ausdrucks (c+a) ein unsigned int oder ein signed
> int?

Es ist erstmal ein signed int.  Der wird aber beim Vergleich dann
durch einfaches gedankliches Kopieren der Bits in einen unsigned int
umgewandelt.  Falls das vorherige Ergebnis der vorzeichenbehafteten
Operation negativ war, vergleichst du auf diese Weise mit einer
sehr großen vorzeichenlosen Zahl, was sicher nicht das ist, was du
eigentlich wolltest.

Aus gutem Grund ist der Vergleich zwischen vorzeichenbehafteten und
vorzeichenlosen Zahlen dem GCC eine Warnung wert.
#683008
Lesenswert?
• ▲
▼
Jörg Wunsch wrote:

> Es ist erstmal ein signed int.

Nein. Bei Operationen zwischen "signed int" und "unsigned int" ist das 
Ergebnis vom Typ "unsigned int". Bei gleicher Grösse gewinnt "unsigned".

Und folglich ist der Vergleich hier unproblematisch, der ist zwischen 
"unsigned" und "unsigned". Die Addition ist problematisch, und ob er da 
meckert?

PS: Alle bitte nochmal hingucken - das ist nicht die übliche 
Standardfalle mit "unsigned char" und "int", sondern "unsigned int" und 
"int", also gleiche Grösse.
Gast #683584
Lesenswert?
• ▲
▼
Hallo,
danke für die Antworten.
Was wird eigentlich bei einem Vergleich von
((signed int)>(unsigned int))
angewendet? Ein vorzeichenbehafteter Vergleich oder ein vorzeichenloser 
Vergleich?

danke
gruss markus
Gast #683594
Lesenswert?
• ▲
▼
Bei jeder binären Operation (egal, ob Rechen- oder Vergleichsopera-
tion) wird bei Integeroperanden gleicher Größe aber unterschiedlicher
Signedness der Signed-Operand vor Ausführung der Operation in unsigned
umgewandelt. Das gilt auch für dein Beispiel.

Antwort schreiben

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.

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.