Vergleich signed / unsigned?



  • Wenn ich einen Signed- Wert mit einem Unsigned vergleiche: wer gewinnt, und warum?
    (d.h. wie sehen die automatischen Typumwandlungen aus`?

    dankeschön schonmal



  • unsigned. (sind im standard unter "usual arithmetic conversions" zu finden)
    -1 < 1 und -1 > 1U
    ich nehme an, das ist so, weil du meistens, wenn du so einen vergleich machst, keine negativen werte hast (dann müsstest du ja nicht vergleichen) - für den weniger häufigen fall musst du denn vorzeichenlosen wert eben in einen vorzeichenbehafteten casten, der groß genug ist, den wert aufzunehmen.



  • achja, ich bin davon ausgegangen, dass bei signed X und unsigned Y du meinst, dass X und Y derselben Typ ist.
    im prinzip ist es so, dass wann immer es möglich ist, den ursprünglichen wert zu erhalten, er auch erhalten wird:

    assert (sizeof(short) < sizeof(int)); //nur dann
    (signed int)-1 < (unsigned short)1;
    

    hier wird alles zu int.



  • dank schön erstmal.
    Kannst du noch etwas detaillierter? Hab keinen Standard da 🤡



  • also gut, *abschreib*
    5/9 (nicht 5.9)
    - ist ein operand vom typ long double, wird der andere nach long double konvertiert.
    - andernfalls, wenn ein operand vom typ double ist, wird der andere nach double konvertiert.
    - andernfalls, wenn ein operand vom typ float ist, wird der andere nach float konvertiert.
    - andernfalls sollen die "integral promotions" (4.5) auf beide operanden angewendet werden.
    - weiters, falls ein operand vom typ unsigned long ist, wird der andere nach unsigned long konvertiert.
    - andernfalls, wenn ein operand vom typ long int und der andere vom typ unsigned int ist und long int alle werte von unsigned int aufnehmen kann, wird der unsigned int in ein long int konvertiert, andernfalls werden beide operanden in unsigned long int konvertiert.
    - andernfalls, wenn ein operand long ist, wird der andere auch long
    - andernfalls, wenn ein operand unsigned ist, wird der andere auch unsigned
    - andernfalls sind beide operanden vom typ int.
    (integral promotions / 4.5)

    1. rvalues vomt yp char, unsigned char, signed char, short int oder unsigned short int können alle in ein rvalue vom typ int umgewandelt werden, falls int alle deren werte aufnehmen kann - andernfalls wird der wert in ein unsigned int umgewandelt.
    2. wchar_t und ein enum typ wird in den ersten der folgenden typen umgewandelt, der alle werte derer "underlying type"s aufnehmen kann: int, unsigned int, long, unsigned long
    3. bezieht sich auf bitfelder und 4) auf bool (true->int(1), false->int(0))


  • Du bist so gut zu mir 😉
    Ausgedruckt und an die Wand gehängt



  • davie hast du das jetzt übersetzt oder hast du den Standard auf Deutsch?

    Du hättest doch einfach das aus dem PDF rauskopieren können. Englisch kann Peterchen selbst.



  • war mir nicht sicher, ob einfaches copy&paste auch erlaubt ist, bzw. hab es gar nicht erst ausprobiert.



  • Sicher ist es unter Quellenangabe erlaubt, den C++-ISO-Standard (in Maßen) zu zitieren. Das ist keinesfalls geistiger Diebstahl. 🙂
    Eine unautorisierte Übersetzung ins Deutsche könnte allerdings Probleme herauf beschwören. 😃 😉



  • toll 🙄


Anmelden zum Antworten