Normalerweise erfordert C, dass Operanden eines binären Operators zum Typ des übergeordneten Operanden hochgestuft werden. Dies kann zu vermeiden, ausgenutzt werden Code mit ausführlichen Abgüsse Füllung, zum Beispiel:Bitshift und Integer-Promotion?
if (x-48U<10) ...
y = x+0ULL << 40;
usw.
Allerdings habe ich festgestellt, dass, zumindest mit gcc, tritt dieses Verhalten nicht für bitshifts arbeiten. I.e.
int x = 1;
unsigned long long y = x << 32ULL;
Ich würde den Typ des rechten Operanden erwartet, dass die linken Operanden bewirken unsigned long long
gefördert werden, so dass die Verschiebung erfolgreich ist. Aber stattdessen gcc druckt eine Warnung:
warning: left shift count >= width of type
gcc gebrochen ist, oder hat der Standard eine Ausnahme von der Typ Förderung Regeln für bitshifts machen?
Wird es trotzdem fördern, unabhängig von der Warnung? (Es ist nur eine Warnung, immerhin). –
Könnten Sie nicht einfach ein kurzes Makro verwenden, um die ausführliche Besetzung zu erstellen? Wie '#definiere ULL (x) ((unsigned long long) x)'? – Borealid
@Robert: Nein, es erzeugt ein No-Op, als ob ich einfach '<< 32 geschrieben hätte. @ Borealid: Ja, ich könnte, aber ich schreibe gern Code, der überall kopiert und eingefügt werden kann (z. B. andere Projekte), ohne dass zusätzliche Definitionen/Header erforderlich sind. Ich hasse Dinge wie 'typedef unsigned int uint;'. –