2016-10-28 2 views
0

Я пытаюсь получить число, которое равно 16 цифрам 0x1122334455667788, и бит смещает его для учета минимальной нумерации.uint64_t in C, действующий как uint32_t

Используя следующий пример кода для загрузки числа в из ячеек памяти

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); 
    } 
} 

Выход производит:

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 

Это не имеет смысла для меня до тех пор, оных 0x44, почему делает бит сдвиг не будет продолжать толкать цифры влево? Почему я не могу сделать число из 8 цифр?

+2

Что такое 'memory_t'? Кроме того, ваша строка 'save' выдается перед вашей линией' add'? – yano

+4

Для печати 'uint64_t' вам нужен другой спецификатор формата, например'% llx'. –

+2

Включите предупреждения компилятора. – Schwern

ответ

3

Включите предупреждения компилятора, возможно, с -Wall, и проблема будет обнаружена.

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 

Вы должны использовать %llx для печати 64 разрядное целое число (долго долго Int).

+2

Было бы более удобно использовать макрос 'PRIx64' из' stdint.h' для предоставления кода поля: 'printf (« сохранить 0x »PRIx64« \ n », * save);'. Это объясняет изменение реализации, относительно которого тип соответствует 'uint64_t'. –

Смежные вопросы