Nutzung von unsigned int



  • Macht es eigentlich Sinn, wenn es im Kontext unsinnig wäre, das bestimmte Werte negativ sein können, unsigned int zu verwenden oder ist das eigentlich egal? Immerhin ist es etwas nervig, einen solchen Wert in einer Schleife zu haben, wo dann auch die Zählvariable unsigned sein sollte.

    Und was wäre ein sinnvoller Einsatz von unsigned int?



  • Mit solchen Fragen kann man Glaubenskriege auslösen 😉



  • Interessante Anekdote zum Thema, die einen Teilaspekt der Diskussion beleuchtet (sehenswert, wers nicht schon kennt):

    CppCon 2016: Chandler Carruth “Garbage In, Garbage Out: Arguing about Undefined Behavior...", ab 39:16



  • Die unsigned -Typen haben den Vorteil, dass sie modulare Arithmetik im Ring Z/2nZ\mathbb{Z}/2^n \mathbb{Z} implementieren, wohingegen signed OF/UF UB ist. Für Bitmasken und dergleichen nimmt man auch unsigned , denn z.B. -1>>1 ist implementation-defined (i.d.R. zieht es aber das Vorzeichen mit).
    Für Zählvariablen in Schleifen kann ein signed -Typ zu besserer Code-Generierung führen. Zum Beispiel:

    for(int i = a; i != b; i += 4) // ...
    

    Hier weiß der Compiler, dass (a%4 == b%4) gelten muss. Wäre i ein unsigned , so wüsste er das nicht.

    LG



  • Fytch schrieb:

    Zum Beispiel:

    for(int i = a; i != b; i += 4) // ...
    

    Hier weiß der Compiler, dass (a%4 == b%4) gelten muss.

    Bitte erkläre das genauer.

    Angenommen a = -1, b = 3.
    a % 4 = -1
    b % 4 = 3
    -1 != 3



  • Ups, da hab ich mich vertan. Ich meinte, dass (a&3) == (b&3) (auf Maschinen mit Zweierkomplement). Oder in Worten: dass a und b in der gleichen Restklasse modulo 4 sind.

    LG



  • Bjarne Stroustrup schreibt dazu:
    Die unsigned-Ganzzahltypen sind ideal geeignet, wenn Werte als Bitarray zu speichern sind. Allerdings ist es fast nie zu empfehlen, einen unsigned anstelle eines int zu verwenden, um ein Bit für die Darstellung von positiven Ganzzahlen zu gewinnen. Versucht man sicherzustellen, dass bestimmte Werte positiv sind, indem man Variablen als unsigned deklariert, wird dies in der Regel durch die impliziten Konvertierungsregeln vereitelt.

    Der C++ Erfinder selber hält unsigned-Typen also nur in Bitarrays für sinnvoll.



  • bei unbedachtem Einsatz von unsigned können sich auch Fehler einschleichen, die vielleicht nicht jeder auf den ersten Blick sieht.

    unsigned int i = 3;
    do printf("%d\n", i); while (--i >= 0);
    


  • Wenn man sucht, finden sich solche Diskussionen zuhauf. Gut, das dies jetzt auch in deutsch getan wurde 🙂



  • zufallswert schrieb:

    bei unbedachtem Einsatz von unsigned können sich auch Fehler einschleichen, die vielleicht nicht jeder auf den ersten Blick sieht.

    unsigned int i = 3;
    do printf("%d\n", i); while (--i >= 0);
    

    Naja, man sollte immer mit Warnungen compilieren. Das sollte sowas wie

    warning: comparison of unsigned expression >= 0 is always true [-Wtautological-compare]                                                                                                       
    while (--i >= 0);                                                                                        
           ~~~ ^  ~
    

    liefern.



  • man sollte sich aber nie darauf verlassen, daß der Compiler schon jeden Schrott anmahnen wird.



  • Wenn du deinen Compiler kennst und weißt, was er ammahnt, wieso nicht?



  • weil du vielleicht mal auf einer anderen Plattform mit einem anderen Compiler und einer anderen IDE arbeiten mußt.

    Und wenn du gelernt hast, dich darauf zu verlassen, daß du bestimmte Fehler ruhig machen kannst, weil der Compiler sie schon anmeckern wird, kann es Probleme geben, wenn diese Fehler auf einer anderen Plattform stillschweigend durchgewunken werden und das Ergebnis zur Laufzeit crasht.

    Unangenehme Erfahrung beim Multi-Plattform-Programmieren, wenn man etwas, das man auf einer nachgiebigen Compiler-Plattform programmiert hat, wo einiges nicht-Standard-Konforme durchgelassen wird, irgendwann auf einer Plattform bauen muß, die strikt auf Einhaltung der Standards pocht 😮 🙄 😃


Anmelden zum Antworten