2016-10-28 5 views
0

Ich versuche, eine Zahl, die 16 Ziffern lang ist 0x1122334455667788 und Bit verschiebt es für kleine Endian Nummerierung zu berücksichtigen.Uint64_t in C fungiert als ein uint32_t

den folgenden Beispielcode verwenden, die Anzahl in von Speicherzellen zu laden

void endianCompute(memory_t memory, uint64_t start, uint64_t *save, int size){ 
    *save = 0; 
    for(int i = 0; i < size; i++){ 
     *save += memory[start + i] << (i)*8; 
     printf("add 0x%x\n", memory[start + i] << (i)*8); 
     printf("save 0x%x\n", *save); 
    } 
} 

Der Ausgang gibt:

save 0x88 
add 0x7700 
save 0x7788 
add 0x660000 
save 0x667788 
add 0x55000000 
save 0x55667788 
add 0x44 
save 0x556677cc 
add 0x3300 
save 0x5566aacc 
add 0x220000 
save 0x5588aacc 
add 0x11000000 
save 0x6688aacc 

Das macht Sinn für mich, bis das Add 0x44, warum das Bit tut Shift nicht weiter die Zahlen nach links schieben? Warum kann ich keine Zahl hinter 8 Ziffern setzen?

+2

was ist 'memory_t'? Außerdem wird Ihre 'save' Zeile vor Ihrer' add' Zeile ausgedruckt. – yano

+4

Um 'uint64_t' zu drucken, benötigen Sie einen anderen Formatbezeichner, wie'% llx'. –

+2

Aktivieren Sie die Compilerwarnungen. – Schwern

Antwort

3

Aktivieren Sie Compilerwarnungen, wahrscheinlich mit -Wall, und das Problem wird aufgedeckt.

cc -Wall -g test.c -o test 
test.c:10:27: warning: format specifies type 'unsigned int' but the argument has type 'uint64_t' 
     (aka 'unsigned long long') [-Wformat] 
    printf("save 0x%x\n", *save); 
        ~~  ^~~~~ 
        %llx 

Sie müssen %llx verwenden, um eine 64-Bit-Integer (long long int) zu drucken.

+2

Es wäre portabler, das Makro 'PRIx64' von' stdint.h' zu verwenden, um den Feldcode zu liefern: 'printf (" save 0x "PRIx64" \ n ", * save);'. Dies berücksichtigt Implementierungsvariationen in Bezug darauf, welcher Typ "uint64_t" entspricht. –

Verwandte Themen