Hier ist das Programm, dessen Zusammenstellung Ausgang macht mich weinen:2^32 - 1 nicht Teil von uint32_t?
#include <inttypes.h>
int main()
{
uint32_t limit = (1 << 32) - 1; // 2^32 - 1 right?
}
und hier ist die Zusammenstellung Ausgang:
~/workspace/CCode$ gcc uint32.c
uint32.c: In function ‘main’:
uint32.c:5:29: warning: left shift count >= width of type [-Wshift-count-overflow]
uint32_t limit = (1 << 32) - 1; // 2^32 - 1 right?
Ich dachte, dass (1 << 32) - 1
-2^32 gleich - 1, und dass ganze Zahlen ohne Vorzeichen auf 32 Bits reichen von 0 bis 2^32 - 1, ist das nicht der Fall? Was habe ich falsch gemacht?
Die Warnung sagt alles. Sie können den Wert eines Ausdrucks, der nicht ausgedrückt werden kann, nicht berechnen. –
Vielleicht ist das Problem hier, dass (1 << 32) erfordert 1 Bit mehr Speicherplatz (33 Bits), um den Wert zu speichern - so der Compiler passt, da Sie mit einer 32-Bit-Variable arbeiten. –
mit 32-Bit int, 2^32 - 1 passt (unsigned) ... Problem ist, 2^32 wird nicht, und es ist ein Teil des Ausdrucks, den Sie berechnen 2^32-1 mit. Aus anderen Gründen werden Sie wahrscheinlich am Ende trotzdem die richtige Antwort erhalten, da uint32_t modulo 2^32 ist. – Dmitri