Ich habe Code, der von Daten abhängt, die eine Mischung aus uint16_t-, int32_t / uint32_t- und int64_t-Werten sind. Es enthält auch einige größere bitverschobene Konstanten (z. B. 1 & lt; & lt; 23, sogar 1 & lt; & lt; 33).
Bei der Berechnung eines int64_t-Werts, wenn ich jeden Unter-Teil sorgfältig umsetze (z. B. Uint16_t-Werte nach int64_t up-casting), funktioniert es - wenn nicht, gehen die Berechnungen oft schief.
Ich habe einen Code, der so aussieht:
%Vor%Ich frage mich allerdings, ob meine Sprengung von Typwürfen hier zu überladen und zu großzügig ist. Ich bin mir nicht sicher, ob die 1 & lt; & lt; 8 die Besetzung erfordert (während, obwohl sie keine hat, 1 & lt; & lt; 23 nicht zu fehlerhaften Berechnungen führt), aber vielleicht tun sie es auch. Wie viel ist zu viel, wenn es darum geht, Werte für eine Berechnung wie diese hochzurechnen?
Edit: Also, es ist klar, ich frage, was die richtige Mindestmenge an Casting ist - was ist für korrekte Funktionalität notwendig (man kann mehr Casts oder Modifikatoren hinzufügen, um Klarheit zu schaffen, aber aus der Sicht des Compilers, )
Edit2: Ich benutze C-Style-Umwandlungen, da dies von einer eingebetteten Codebasis vom Typ Arduino ist (die selbst diese Art von Umwandlungen bereits verwendet hat). Aus der Perspektive des gewünschten Effekts scheinen sie gleichwertig zu sein, daher habe ich den bestehenden Codierungsstil verwendet.
Im Allgemeinen können Sie sich darauf verlassen, dass die Integer-Promotions Ihnen die korrekte Operation geben, , solange einer der Operanden für jeden Operator die richtige Größe hat . So könnte Ihr erstes Beispiel vereinfacht werden:
%Vor%Achten Sie darauf, die Vorrangregeln zu beachten, um zu wissen, in welcher Reihenfolge die Operatoren angewendet werden!
Sie könnten Probleme bekommen, wenn Sie signierte und unsignierte Typen derselben Größe mischen, obwohl beide zu einem größeren signierten Typ hochstufen sollten.
Sie müssen vorsichtig mit Konstanten sein, denn ohne Dekoration sind das die Standard-Integer-Größe und signiert. 1<<8
wird kein Problem sein, aber 1<<35
wird wahrscheinlich; Sie benötigen 1LL<<35
.
Im Zweifelsfall können ein paar zusätzliche Würfe oder Klammern nicht schaden.
Tags und Links c++